#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;
}
Run Code Online (Sandbox Code Playgroud)
使用 gcc 11.2.0 进行编译和测试,并使用gcc -std=c17 -pedantic -Wall -Wextra test.c和g++ -std=c++17 -pedantic -Wall -Wextra test.cpp。两者都不会对a()、b()和发出任何警告c()。这是故意的,还是一个错误?
简短回答:C 警告是一个谜。-Wformat-signedness如果您想在此处出现警告,请使用。
请注意,-Wformat-signedness需要-Wformat,它已由 启用-Wall。
-Wformat-signedness显然,编译器仅在使用时检查符号不匹配。-Wall并且-Wextra不包括-Wformat-signedness. 我不知道这是为什么。有人说这是因为它会导致太多警告,但这告诉我如果这是一个如此常见的错误,确实需要使用它!
因此,所检查的只是尺寸不匹配。两个警告 (d和) 会发出警告,因为传递e的类型值可能大于该值。int至于其他两个,signed char和值在传递给 variadric( ) 函数(如 )时short int会提升为值,因此和相当于。int...printfabc
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |