c++ - 试图仅在 g++ 的宏中使 -Waggregate-return 保持沉默 - 错误的编译器?

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

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

但是手动展开的版本不会产生任何警告:

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);

行为不应该相同吗?

我认为 ResultExpressionDecomposer 类型无关紧要 - 只是类。

我正在尝试让表达式分解像 here 一样工作(事情已经重命名了一点)。

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

我的问题是:为什么?在使用宏的第一种情况下,我怎样才能不发出警告?我无法在全局范围内消除警告。

最佳答案

这些错误看起来相关:

所以它可能与行号比较或解析器中的一些类似问题有关,并且它可能会在未来的某个版本中得到修复。

关于c++ - 试图仅在 g++ 的宏中使 -Waggregate-return 保持沉默 - 错误的编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35828407/

相关文章:

c++ - 这些行号在此错误中意味着什么?

c++ - "padding class ' Tester' with 4 bytes"警告是什么意思?

Delphi禁用警告失败

c++ - C4244 4 级关于复合加法赋值的警告,但不涉及求和和赋值

c++ - 从资源加载图像失败

c++ - 如何使用 UART 传输数据结构?

android - 简单的 android 二进制文件与 zlib 崩溃

c++ - 运行编译程序 - "Invalid argument"

c++ - 我可以在不使用虚函数的情况下获得多态行为吗?

c++ - 已定义构造函数的无法识别的构造函数