2016-03-06 44 views
5

使用g ++以及与-Waggregate-return试图沉默-Waggregate - 只返回一个宏的g ++ - 越野车编译器?

#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 < <是使用以免库

我的问题是对问题的现场演示:为什么呢?我如何在第一种情况下使用宏免费警告?我无法承担全球范围内的警告。

+0

我知道这并不回答这个问题,但'-Waggregate-return'似乎相当迂腐,应该被忽略,特别是在C++中,通过值返回是完全正常的。你可以看看[这个问题](http://stackoverflow.com/questions/14016993/confusion-in-regards-to-purpose-behavior-of-waggregate-return)。 –

+1

我依稀记得GCC在宏中有编译指示问题;你可能想要搜索他们的bugzilla。 –

+0

@AlexandreC。我永远不会使用这个警告的个人代码,但我正在写的图书馆应该是完全警告,即使在最激进的水平(我受到完美主义)...此外这种警告是不是''' - 墙上' ''或'''-Wextra'''很有道理... – onqtam

回答

1

这些错误看起来相关:

因此,它可能有行号的比较做,或者一些解析器中类似的问题,它可能会在未来的某些版本中得到修复版为。

+0

哇,这似乎相当普遍......到目前为止,我已经沉默了与'''_Pragma''只有警告警告,它在那里工作正常...奇怪的是,海湾合作委员会将不会有这么长时间的工作正常 – onqtam

+0

@onqtam它会在一个宏的外面正常工作,并根据第一个错误repory,也在C.海湾合作委员会的错误获得固定的基础上,的bug;有点宣传不会伤害,但是还有很多老的未解决的错误。警告错误通常并不重要,afaik。 – rici

+0

@onqtam顺便说一句,你确实需要在宏中使用'expr'加上括号(它使用的地方,而不是原型)。 – rici

-2

你可以尝试:

#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) 
+0

甚至不会编译 – onqtam