[英]Why doesn't gcc emit a format warning?
#include <stdio.h>
void a(signed char a) {
printf("%u\n", a);
}
void b(short b) {
printf("%u\n", b);
}
void c(int c) {
printf("%u\n", c);
}
void d(long d) {
printf("%u\n", d);
}
void e(long long e) {
printf("%u\n", e);
}
int main() {
a(-1); //no warning
b(-1); //no warning
c(-1); //no warning
d(-1); //warning
e(-1); //warning
return 0;
}
使用gcc -std=c17 -pedantic -Wall -Wextra test.c
和g++ -std=c++17 -pedantic -Wall -Wextra test.cpp
使用 gcc 11.2.0 编译和测试。 两者都不会向a()
、 b()
和c()
发出任何警告。 这是故意的,还是错误?
简短回答:C 警告是一个谜。 如果您想在此处发出警告,请使用-Wformat-signedness
。
请注意, -Wformat-signedness
需要-Wformat
,它已由-Wall
启用。
显然,编译器仅在使用-Wformat-signedness
时检查符号不匹配。 -Wall
和-Wextra
不包括-Wformat-signedness
。 我不知道这是为什么。 有人说是因为它会导致太多警告,但这告诉我,如果它是一个常见的错误,它确实需要使用!
因此,所有正在检查的都是大小不匹配。 警告的两个( d
和e
)警告是因为正在传递可能大于int
的类型值。 至于其他两个, signed char
和short int
值在传递给printf
等可变参数 ( ...
) 函数时会提升为int
值,因此a
和b
等效于c
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.