试图仅在 g++ 的宏中使 -Waggregate-return 静音 - 错误的编译器?
trying to silence -Waggregate-return only in a macro for g++ - buggy compiler?
使用 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);
行为不应该相同吗?
我认为 Result
和 ExpressionDecomposer
类型无关紧要 - 只是 类.
我正在尝试让表达式分解像 here 一样工作(已经稍微重命名了)。
编辑: >> here << 是使用 lest 库的问题的现场演示
我的问题是:为什么?在使用宏的第一种情况下,我怎样才能不发出警告?我不能在全球范围内消除警告。
你可以试试:
#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)
这些错误看起来相关:
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55578
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69543
所以它可能与行号比较或解析器中的一些类似问题有关,并且它可能会在未来的某个版本中得到修复。
使用 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);
行为不应该相同吗?
我认为 Result
和 ExpressionDecomposer
类型无关紧要 - 只是 类.
我正在尝试让表达式分解像 here 一样工作(已经稍微重命名了)。
编辑: >> here << 是使用 lest 库的问题的现场演示
我的问题是:为什么?在使用宏的第一种情况下,我怎样才能不发出警告?我不能在全球范围内消除警告。
你可以试试:
#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)
这些错误看起来相关:
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55578
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69543
所以它可能与行号比较或解析器中的一些类似问题有关,并且它可能会在未来的某个版本中得到修复。