2016-04-25 47 views
0

如何获得GCC或Clang警告我以下错误,其中M在第2行应该是N关于不正确的包装编译指示的警告

即使有-Wall -Wextra -Wunknown-pragmas,这些编译器都不会发出任何警告。

#define N 4 
#pragma pack(push, M) 

int main() { 
    return 0; 
} 

#pragma pack(pop) 
+1

的#ifndef中号 #ERROR整数或标识符M没有定义 #endif –

回答

0

只有当代码有效时,编译器才能知道你的意图。你可以自己去查了这个

#ifndef M 
    #error M not defined 
#endif 

或者,如果M分别从N这个

#if M != N 
    #error M is not N 
#endif 
0

如果你看看预处理器的输出,如果您添加附注不即计算定义N预处理器完成后,您将不会收到4

我不认为你可以在这里发出警告,至少不容易,也许预处理器向导可能会弄清楚。除非#if声明中的值未定义,否则以下警告无效。

-Wundef 

如果尝试添加任何东西到编译即

#pragma pack(push, (M + 0)) 

你得到一个警告,因为编译期待即

warning: expected integer or identifier in '#pragma pack' 
+1

你似乎认为''M'标识符在'#pragma'中的处理方式与'#i中#'相同fdef'指令。尽管这看起来似乎是合理的,但据我所知,该标准完全取决于实施。你有任何支持你的结论的GCC或Clang文档吗? –

+0

@JohnBollinger你是对的,它在叮当中的处理方式不同,它没有按照我所知道的那样进行评估。 – Harry