为什么使用stdbool.h会在与-wditional-conversion结合使用时引发警告

时间:2012-05-14 10:03:14

标签: c gcc gcc-warning

这是一个例子:

#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

为什么会出现这些警告?据我所知,参数都是相同的类型,因此应该是相同的宽度。什么是-Wditional传统转换在这段非常简单的代码中引起这些警告?

当我从使用自己的typedef bool切换到stdbool.h def时,我开始出现这些错误。

我最初的def是:

typedef enum {false, true} bool;

2 个答案:

答案 0 :(得分:1)

这是一个不理解编译器警告标志的情况。

使用-Wconversion而非-Wtraditional-conversion获取警告隐式转化的警告。 -Wtraditional-conversion用于在没有原型的情况下发出有关转化的警告。

因为typdef enum创建了一个默认的整数bool类型(通常为32位)而被捕获,其中stdbool.h将bool定义为8位,与C ++ bool兼容。

答案 1 :(得分:0)

bar的调用的警告是正确的,因为您要求编译器是pendantic。 false扩展为int常量0,因此它不是bool(或_Bool)。

第一个警告是一个错误。