我正在探索GCC使用该gcc -Q --help=warning语法提供的警告。(有关此内容的更多信息,请参见3.2选项控制输出的种类。)
我想到的是,许多警告(使用GCC版本6.4.1的250中有109个)未分类为C ++。我的意思是,当执行受限查询时,它们不会出现gcc -Q --help=warning,c++。(出于好奇,有81条警告既未分类为C ++也未分类为C。)
但是,至少其中一些警告确实在C ++中起作用。举个例子-Waggregate-return。(在Compiler Explorer上查看)。
在-Waggregate-return默认情况下禁用,我知道这可能是没有多大用处呢(见在问候的-Waggregate回报的目的/行为的混乱呢?)。但是,这只是一个示例,在相同情况下的那些109中也许有一些有用的标志。
那么,为什么有些GCC警告标志不属于C ++语言,但可以在C ++中工作?这是什么规则?
当使用gcc和-Waggregate-return标志尝试以下示例时,警告:function call has aggregate value触发器:
struct Element {
// ... stuff ...
}
Container<Element> elements(10);
for_each(begin(elements),end(elements),[](Element& e){
// ... modify elements ...
});
Run Code Online (Sandbox Code Playgroud)
据我所知,-Waggregate-return标志"警告,如果任何返回结构或联合的函数被定义或调用",因为,如果我理解正确,你可能会通过返回一个足够大的对象来溢出堆栈.
然而,for_each返回类型的拉姆达,其类型为void.为什么会触发警告?我错过了什么?我该如何改进我的代码?
使用g ++和编译 -Waggregate-return
#define DOCTEST_CHECK(expr) \
do { \
_Pragma("GCC diagnostic push"); \
_Pragma("GCC diagnostic ignored \"-Waggregate-return\"");\
if(Result failed = (ExpressionDecomposer() << expr)) \
printf("%s\n", failed.m_decomposition.c_str()); \
_Pragma("GCC diagnostic pop"); \
} while(false)
DOCTEST_CHECK(true == false); // produces warnings
Run Code Online (Sandbox Code Playgroud)
但手动展开的版本不会产生任何警告:
do {
_Pragma("GCC diagnostic push");
_Pragma("GCC diagnostic ignored \"-Waggregate-return\"");
if(Result failed = (ExpressionDecomposer() << true == false))
printf("%s\n", failed.m_decomposition.c_str());
_Pragma("GCC diagnostic pop");
} while(false);
Run Code Online (Sandbox Code Playgroud)
这个行为应该不一样吗?
我不认为Result和ExpressionDecomposer类型很重要 - 只是课程.
我正试图让表达式分解像这里一样工作(事情已经重新命名了一下).
编辑: >> here <<是使用lest库的问题的现场演示
我的问题是:为什么?如何使用宏在第一种情况下自由警告?我无法承受全球范围内的警告.