簡體   English   中英

如何指定不應該在C中編譯的{} init來gcc?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM