这是一个例子:
#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;
答案 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
)。
第一个警告是一个错误。