[英]How can I specify to gcc that {} init in C shouldn't compile?
使用gcc使用-std=gnu99
,將編譯以下代碼:
void f()
{
struct X data = {};
// do something with data
}
這是有效的C嗎? 這是gnu擴展名嗎?
我怎樣才能告訴gcc不接受這種初始化?
我想確保與其他編譯器的兼容性(例如,Visual 2015)
不,空的初始化程序不是標准的C。它是gcc擴展。 有關詳細說明, 請參見此。
通過指定-std=gnu99
,您允許使用GNU擴展。 您可以通過指定-std=cXX
選項來強制編譯器僅允許符合標准的代碼。
從gcc在線手冊 ( 重點是我的 )
-std=
編譯器可以接受多個基本標准,例如“ c90”或“ c ++ 98”,以及這些標准的GNU方言,例如“ gnu90”或“ gnu ++ 98”。 指定基本標准后,編譯器將接受該標准之后的所有程序,以及使用與該標准不矛盾的GNU擴展的程序。 例如,-std = c90關閉與ISO C90不兼容的GCC某些功能,例如asm和typeof關鍵字,但不關閉其他在ISO C90中沒有意義的GNU擴展,例如省略中間的?:表達式。 另一方面, 當指定標准的GNU方言時,即使這些功能更改了基本標准的含義,也將啟用編譯器支持的所有功能。 結果,可能會拒絕某些嚴格符合要求的程序。 在給定標准版本的情況下,-Wpedantic使用特定的標准來標識哪些功能是GNU擴展。 例如,-std = gnu90 -Wpedantic會警告有關C ++樣式的“ //”注釋,而-std = gnu99 -Wpedantic不會。
在這種情況下, -pedantic
選項將導致顯示警告,而-Werror
將導致將所有警告視為錯誤。
例如:
x1.c: In function ‘f’:
x1.c:11:19: error: ISO C forbids empty initializer braces [-Werror=pedantic]
struct X data = {};
如果要拒絕包含GNU特定擴展名的代碼,請使用-std=c99 -pedantic-errors
( -pedantic
將發出非標准擴展名的診斷信息,但不一定會完全拒絕該代碼)。 但是,如果要保證符合ISO標准,請注意,這不是100%的解決方案。 從gcc
手冊頁:
一些用戶嘗試使用
-pedantic
檢查程序是否嚴格符合-pedantic
。 他們很快發現它並不能完全滿足他們的要求:它找到了一些非ISO的實踐,但並沒有全部-僅是那些需要ISO C進行診斷的實踐,以及一些已經添加了診斷的實踐。報告某些不符合ISO C要求的功能可能在某些情況下很有用,但將需要大量額外工作,並且與
-pedantic
會有很大不同。 我們沒有計划在不久的將來支持這種功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.