2016-03-06 48 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