2012-11-30 64 views
5

我遇到了一個問題,最近在下面的例子玩具完全編譯使用clang -ansi`鐺-ansi`擴展

int main(void) 
{ 
    for (int i = 0; 0;); 
    return i; 
} 

gcc -ansi提供了以下錯誤:

a.c: In function ‘main’: 
a.c:3:5: error: ‘for’ loop initial declarations are only allowed in C99 mode 
a.c:3:5: note: use option -std=c99 or -std=gnu99 to compile your code 

clang -ansi -pedantic顯示編譯正在使用C99擴展。

a.c:3:10: warning: variable declaration in for loop is a C99-specific feature [-pedantic,-Wc99-extensions] 
    for (int i = 0; 0;); 
     ^
1 warning generated. 

什麼其他的擴展不鐺允許與-ansi選項?我如何禁用它們?

+0

我剛剛幾分鐘前碰到了類似的問題:鐺允許在同一個塊可執行代碼後進行定義的變量 - 在C99合法的,但應該在ANSI是非法的。 – cdarke

+0

上面的完整示例在C99中也是非法的,因爲在返回語句中使用'i'時沒有定義。 Clang和GCC同意這一點。似乎C99擴展的這種特殊用法使其合法。 – cyang

+0

你是對的,我沒有在OPs代碼中發現(專注於我自己的問題)。 – cdarke

回答

4

如果你想在-ansi模式來禁用擴展,那麼你要這些警告視爲錯誤:使用-pedantic-errors代替-pedantic,或-Werror(或兩者)。要更細緻地控制錯誤,請參閱Clang manual

+0

謝謝。看起來像'-ansi'模式中啓用的擴展列表不存在。 – cyang