草庐IT

conditional-compilation

全部标签

c++ - 在 for-loop : compiler bug? 中重新排序测试条件

我有一个存储在数组中的树,我正试图找到一个特定的节点:std::vectornodes=...constunsignedshortsentinel=-1;unsignedshortindex=0;for(Node*node=&nodes[index];//rootnodeindex!=sentinel;node=&nodes[index]){if(foo(*node)){index=node->left;}else{index=node->right;}}换句话说,没什么特别的。但是,MSVC2012失败并尝试访问nodes[sentinel]这超出了范围。原来它先计算&nodes[i

c++ - 作为类成员的可变大小数组 : why does it compile?

我有这种情况,我无法解释它编译的原因:#includeusingnamespacestd;classX{public:X(){cout我正在定义一个可变大小的X数组作为类Y的成员。在类外这样定义X肯定会导致编译错误,但在类内不会。更重要的是,X的构造函数从未被调用。那么这里发生了什么? 最佳答案 C99,6.7.2.1/16(n1256)Asaspecialcase,thelastelementofastructurewithmorethanonenamedmembermayhaveanincompletearraytype;thi

c++ - [C++ 编译时断言] : Can we throw a compilation error if some condition is not met?

我写了一个函数:templatevoidtryHarder(){for(inti=0;i但我只希望它在N介于0和10之间时编译。我可以这样做吗?怎么办? 最佳答案 您可以使用static_assertdeclaration来完成:templatevoidtryHarder(){static_assert(N>=0&&N此功能仅在C++11之后可用。如果您坚持使用C++03,请查看Boost'sstaticassertmacro.整个想法都是很好的错误信息。如果您不关心这些,或者甚至负担不起boost,您可以执行以下操作:templa

C++ : Can the compiler optimize this code segment?

voidfoo(constintconstant){for(inti=0;i外循环的每次执行都会检查“constant”的值。然而,常量永远不会改变,所以大量的CPU时间被浪费在测试条件常量我个人认为这个问题是不可避免的。即使编译器将比较放在外循环之前并设置某种bool变量“skip_inner_stuff”,仍然必须在外循环的每次传递中检查该变量。您对此事有何看法?是否有更有效的方法来编写上述代码段来避免该问题? 最佳答案 您描述的优化也称为loopunswitching.多年来,它一直是优化编译器的标准部分-但如果您想确保编译器

C++ 模板 : conditionally enabled member function

我正在创建一个非常小的C++项目,我想创建一个简单的vector类来满足我自己的需要。std::vector模板类不会做。当vector类由char组成时s(即vector),我希望它能够与std::string进行比较.经过一番折腾之后,我编写了既能编译又能执行我想要的操作的代码。见下文:#include#include#includetemplateclassWorkingSimpleVector{public:constElementType*elements_;size_tcount_;//...templateinlinetypenamestd::enable_if::val

c++ - Visual Studio : compile list of modules on each platform and configuration

我正在从事一个巨大的C++项目,该项目针对许多平台,每个平台都有多种配置。由于编译时间长,在每个平台上构建整个项目以测试更改是否成功编译不是一种选择。我通常做的是编译我在不同平台/配置组合上修改的单个cpp模块。我想自动执行此过程,无论是使用脚本、VS扩展还是其他任何方式,我都愿意评估不同的选项。我真正需要的是为每个平台和每个配置获取一个cpp文件列表并编译每个文件(基本上遍历配置管理器的所有组合)。这可能吗?关于如何解决这个问题有什么好的建议吗?编辑:我知道这远不是一个完美的解决方案,并且只会发现一部分错误。我仍将不得不面对链接错误、其他cpp单元上的编译器错误取决于修改后的head

c++ - 是否可以实现 C++11 互斥锁概念以供 std::condition_variable 使用?

我发现std::mutexVisualStudio2013中的实现速度太慢。它使用一个重量级的互斥锁来确保即使在所有进程之间也可以实现同步,这一切都很好而且花花公子;除非你不与其他进程交谈并且真的可以使用CRITICAL_SECTION的额外速度在Win32上提供自旋锁。我试图实现fast_recursive_mutex遵循C++11互斥概念并根据规范履行所有义务。从任何意义上说,它都是std::mutex的直接替代品只要您不在进程之间进行同步。它与std::lock_guard配合得很好和std::unique_lock.但是我在尝试将它与std::condition_variabl

c++ - 默认模板参数 : Why does the compiler complain about not specifying template argument?

我有这个代码:structA{};templatestructB{voidfoo(){}};Bb;//Error:missingtemplateargumentsbefore'b'//Error:expected';'before'b'//Moreerrorsb.foo()如果我将foo()作为具有相同模板“签名”的模板函数,编译器不会提示没有指定模板参数:structA{};structB{templatevoidfoo(){}};Bb;//OKb.foo()那么为什么我需要为带有默认参数的模板类指定参数,而不是为模板函数指定参数呢?我是否遗漏了一些微妙之处?原因肯定是因为模板参数推

c++ - C++ 中的 If 语句,主体为空 : is condition guaranteed to be evaluated?

鉴于此声明(作为旁注,这不是我喜欢的编码风格)if(doSomething()){}“C++标准”是否保证函数被调用?(它的返回值对执行路径没有影响,所以编译器可能会遵循捷径评估的思想并将其优化掉。) 最佳答案 不涉及短路运算符,因此如果在不消除副作用的情况下无法优化函数,则可以保证调用该函数。引用C++11标准:[...]conformingimplementationsarerequiredtoemulate(only)theobservablebehavioroftheabstractmachineasexplainedbel

c++ - 为什么在通知 condition_variable 之前需要获取锁来修改共享的 "atomic"变量

这个问题在这里已经有了答案:Whyistherenowaitfunctionforcondition_variablewhichdoesnotrelockthemutex(1个回答)关闭7个月前。根据cppreference.com:Thethreadthatintendstomodifythevariablehastoacquireastd::mutex(typicallyviastd::lock_guard)performthemodificationwhilethelockisheldexecutenotify_oneornotify_allonthestd::condition