相关疑难解决方法(0)

为什么有些GCC警告标志不属于C ++语言,但仍可以在C ++中使用?

我正在探索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 ++中工作?这是什么规则?

c++ gcc

6
推荐指数
1
解决办法
313
查看次数

为什么for_each + lambda触发-Waggregate-return警告?

当使用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.为什么会触发警告?我错过了什么?我该如何改进我的代码?

c++ c++11

5
推荐指数
1
解决办法
799
查看次数

试图沉默-Waggregate-只返回一个宏的g ++ - buggy编译器?

使用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)

这个行为应该不一样吗?

我不认为ResultExpressionDecomposer类型很重要 - 只是课程.

我正试图让表达式分解像这里一样工作(事情已经重新命名了一下).

编辑: >> here <<是使用lest库的问题的现场演示

我的问题是:为什么?如何使用宏在第一种情况下自由警告?我无法承受全球范围内的警告.

c++ g++ compiler-warnings suppress-warnings compiler-bug

5
推荐指数
1
解决办法
167
查看次数