2013-05-14 46 views
3

即使_Bool不是C89的一部分,爲什麼以下命令不會產生警告或錯誤?爲什麼GCC不會在c89模式下抱怨_Bool?

$ echo "_Bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra - 

爲了比較,改變_Boolbool導致錯誤:

$ echo "bool x;" | gcc -x c -c -std=c89 -pedantic -Wall -Wextra - 
    <stdin>:1:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘x’ 

這發生在Cygwin [GCC(GCC)4.5.3]和Linux [GCC(GCC)4.1.2 20080704 (Red Hat 4.1.2-54)]。

+0

GNU擴展... – 2013-05-14 11:24:36

+0

即使在C99中,沒有'#include ' – 2013-05-14 17:26:00

回答

1

在C89編譯器中使用_Bool調用未定義的行爲因爲您使用的標識符以下劃線和大寫字母開頭。我沒有C89方便的文件拷貝,但希望它是一樣的C99 7.1.3:

— All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.

一個允許未定義的行爲正在接受_Bool沒有診斷。這是一個GNU擴展。

當然,bool不屬於實現命名空間,所以必須診斷,除非聲明。

+0

'bool'不存在所以GCC在未定義行爲被調用時不會發出警告? – Jeremy 2013-05-14 12:17:24

+0

更正:在c89模式下使用_Complex時,會發出警告,但不會出現_Bool。看起來很隨意。 – Jeremy 2013-05-14 12:38:35

+0

檢測一般情況下的未定義行爲是不可能的(它需要解決暫停問題)。對於特殊情況,這可能是可行的,這就是C標準明智地將其打開的原因。未定義未定義是未定義的。任何事情都可能發生。診斷是什麼。沉默也是一樣。 – Jens 2013-05-14 13:14:38

相關問題