例如,如何在源文件中刪除「warning: unnamed struct/union that defines no instances
」,而不是通過編譯器命令行選項。如何關閉C源代碼中的指定警告?
我想定義一個C宏CONST_BUG_ON
,我使用它來在編譯時檢查一些常量值。
#define CONST_BUG_ON(e) struct {int a:!(e);}
它給出了警告warning: unnamed struct/union that defines no instances
,但在這種情況下,它不是一個真正的問題。
感謝湯姆·坦納
#define CONST_BUG_ON_3(e, l) struct buggy##l {int a:!(e);}
#define CONST_BUG_ON_2(e, l) CONST_BUG_ON_3(e, l)
#define CONST_BUG_ON(e) CONST_BUG_ON_2(e, __LINE__)
這很好,但還是有一些問題:如果文件a
的第6行包含CONST_BUG_ON(E),並提交a
被文件b
inclued和文件的第6行b
也包含CONST_BUG_ON(e),然後gcc抱怨重新定義了錯誤。使用__COUNTER__
__LINE__
的十六進制可能是完美的,但我的舊編譯器不支持__COUNTER__
。
由於巴西萊Starynkevitch
#define CONST_BUG_ON(e) do { \
int tab[__builtin_constant_p(e)?1:-1] = {0}; \
if (tab[0]) abort(); } while (0)
這是一個C語句,只能在一個地方的功能,我真的想用它的功能外。
海報在他的問題中有* GCC *標記 –
爲什麼這對你如此重要?什麼是真正的用例? –