草庐IT

compiler-specific

全部标签

c++ - 如何摆脱 "C++ exception specification ignored"警告

最近得到一个别人实现过的dll。我必须在我的应用程序中使用它。在他们类的头文件中,他们有函数声明voidfunc1()throw(CCustomException);现在当我编译它时收到警告,C++exceptionspecificationignoredexcepttoindicateafunctionisnot_declspec(nothrow)我读了MSDN-Documentation但无法清楚地理解它。另外,我不想仅仅因为它出现就禁用警告。我想知道我做错了什么而不是禁用它。我想我的函数,说myfunc()从dll访问那个func1()没有那个异常规范列表。因此,我也尝试在我的函

c++ - CMAKE_COMPILER_IS_GNUCXX 和 CMAKE_CXX_COMPILER_ID 为空

我目前正在玩弄CMake并想要检测编译器和编译器版本。我当前的CMakeLists.txt如下所示:cmake_minimum_required(VERSION2.6)set(PROJECT"a_tour_of_c++")set(GNUCXX_MINIMUM_VERSION"4.8")set(CXX_STANDARD"c++11")message("${CMAKE_CXX_COMPILER}")#C:/dev/MinGW/bin/g++.exemessage("${CMAKE_CXX_COMPILER_ID}")#EMPTYmessage("${CMAKE_COMPILER_IS_GN

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++ - Visual Studio : compile list of modules on each platform and configuration

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

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++ - 错误 : uint64_t was not declared in this scope when compiling C++ program

我正在尝试一个简单的程序来打印steady_clock的时间戳值,如下所示:#include#includeusingnamespacestd;intmain(){cout(steady_clock::now().time_since_epoch()).count();cout但是每当我像这样编译时g++-oabcabc.cpp,我总是会遇到错误:Infileincludedfrom/usr/include/c++/4.6/chrono:35:0,fromabc.cpp:2:/usr/include/c++/4.6/bits/c++0x_warning.h:32:2:error:#er

c++ - 在 constexpr 函数中返回一个 C 字符串 : why no warning from the compiler?

考虑以下代码:constexprautof(){autostr="HelloWorld!";returnstr;}intmain(intargc,char*argv[]){staticconstexprautostr=f();std::cout我的编译器不显示任何警告是否正常?它是定义的行为吗?我能保证程序会显示"HelloWorld!"吗?我希望"HelloWorld!"不会超出函数的范围... 最佳答案 在C++中stringliterals有staticstorageduration只要程序运行就可以生存。因此,指向从f返回的