1

这是一个例子:

#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

为什么会出现这些警告?据我所见,参数都是相同的类型,所以应该是相同的宽度。在这段非常简单的代码中,-Wtraditional-conversion 做了什么来导致这些警告?

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

我原来的定义是:

typedef enum {false, true} bool;
4

2 回答 2

2

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

使用-Wconversionnot-Wtraditional-conversion获取警告隐式转换的警告。-Wtraditional-conversion用于在没有原型的情况下警告转换。

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

于 2012-05-24T08:54:03.610 回答
0

调用的警告bar是正确的,因为您要求编译器是悬而未决的。false展开为int常数0,所以它不是bool( 或_Bool)。

第一个警告是一个错误。

于 2012-05-14T10:23:51.347 回答