2017-03-28 12 views
0

매크로에서 확장 된 코드에서 g ++ 경고를 사용하지 않으려합니다. 나의 이해함으로써, _Pragma 매크로 사용을 따라야하고 g++ 컴파일 될 때이 Wparentheses 실행되지 않습니다 :G ++ 무시 _Pragma 진단

#include <stdio.h> 

#define TEST(expr) \ 
    int a = 1; \ 
    _Pragma("GCC diagnostic push") \ 
    _Pragma("GCC diagnostic ignored \"-Wparentheses\"") \ 
    if (a <= expr) { \ 
     printf("filler\n"); \ 
    } \ 
    _Pragma("GCC diagnostic pop") 

int main(){ 
    int b = 2, c = 3; 
    TEST(b == c); 
} 

내가 g++로이를 컴파일 할 때, 내가 사용하지 않도록 노력하고 Wparentheses 경고를 얻을. 예상대로 gcc를 사용하는 경우

[email protected]:/mnt/c/ubuntu$ g++ -Wall -Wextra test3.c 
test3.c: In function ‘int main()’: 
test3.c:8:11: warning: suggest parentheses around comparison in operand of ‘==’ [-Wparentheses] 
    if (a <= expr) { \ 
     ^
test3.c:15:5: note: in expansion of macro ‘TEST’ 
    TEST(b == c); 
    ^

그러나 그것은 작동 : 나는 g++ 버전 4.8.5을 사용하고

[email protected]:/mnt/c/ubuntu$ gcc -Wall -Wextra test3.c 
test3.c: In function ‘main’: 
test3.c:16:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 

.

+0

gcc 4.8.5는 게시 된 소스 코드를'gcc -Wall -Wextra test3.c'로 컴파일하지 않습니다. iostream은 C 헤더 파일이 아니기 때문에'fatal error : iostream : No such file or directory' 명령으로 실패합니다. 실제 코드를 게시하십시오. –

+0

@MikeKinghan 죄송합니다. 질문을 자극 한 .cpp 파일에서 붙여 넣습니다. 이제'printf'를 사용합니다. – Xarn

답변

0

오래있다 표현의 주위에 잠재적으로 깨진 둥근 괄호를 추가하여 매크로 경고

2) 거래 악이기 때문에

1) 일반 기능을 사용하여 더 나은하는 것 g ++ 프런트 엔드를 사용할 때 존재하지 않는 _Pragma s의 g ++ 처리 버그가 있습니다. 유일한 해결책은 충분히 최신 버전의 g ++ (IIRC 6+)로 진행하거나 전체 TU에 대한 경고를 비활성화하는 것입니다.

0

일반적으로 타사 코드에서 발생하는 피할 수없는 경고를 처리하기 위해 경고 압축을 사용하므로 컴파일 로그가 복잡해지지 않습니다. 귀하의 경우는

if (a <= (expr)) { 
+0

해당 코드는 최소한의 예입니다. 실제 코드에서 'a'는 과부하 된'<= '연산자를 사용하여 마법을 수행하는 특수 유형의 인스턴스입니다. – Xarn

+1

[연산자 오버로딩 지침] (http://stackoverflow.com/questions/4421706/operator-overloading/4421708#4421708) 오버로드 된 연산자를 수행하면 마법을 수행 할 것을 제안합니다. (귀하의 경우 <같을 것> = bool, ?)는 일반적으로 좋은 생각이 아니며 종종 논리 결함을 나타냅니다. 그것들을 매크로에 혼합하는 것은 더 나쁘다. – dodo951

+0

나는 [Catch] (https://github.com/philsquared/Catch)와 친구들이 동의하지 않는다고 확신한다. – Xarn