2012-05-14 41 views
0

結合這是一個例子:爲什麼使用stdbool.h原因警告時-Wtraditional轉換

#include <stdbool.h> 

void foo(bool b){}; 
void bar(bool b) {foo(b);} 

int main() { 
    bar(false); 
} 

我編譯:

gcc -Wtraditional-conversion test.c 

我得到這些警告:

test.c: In function 'bar': 
test.c:4: warning: passing argument 1 of 'foo' with different width due to prototype 
test.c: In function 'main': 
test.c:7: warning: passing argument 1 of 'bar' with different width due to prototype 

爲什麼會發生這些警告?據我可以看到參數都是相同的類型,所以應該是相同的寬度。什麼是 - 傳統轉換在這段非常簡單的代碼中引起這些警告?

我從使用我自己的bool typedef切換到stdbool.h def時開始出現這些錯誤。

我原來的清晰度是:

typedef enum {false, true} bool; 
+3

'-Wtraditional-conversion'意思是*如果原型導致類型轉換不同於**中缺少原型***時發生的同一個參數會發生的類型轉換,則發出警告。你似乎在使用C99,那麼爲什麼你需要警告? – cnicutar

+0

你有什麼版本的gcc? –

+0

@JensGustedt gcc(Gentoo 4.4.3-r2 p1.2)4.4.3 – SimonAlfie

回答

1

這是一個不理解編譯器警告標誌的情況。

使用-Wconversion而不是-Wtraditional-conversion可以獲得警告,提醒您關於隱式轉換。 -Wtraditional-conversion用於在沒有原型的情況下警告轉換。

因爲typdef enum創建了一個默認的整數bool類型(通常爲32位),因此stdbool.h將bool定義爲8位,這與C++ bool兼容。

0

呼叫的警告bar是正確的,因爲你問的編譯器是pendantic。 false擴大爲int常數0,所以它不是bool(或_Bool)。

第一個警告是一個錯誤。

相關問題