为什么 gcc 不发出格式警告?

3 c c++ gcc

#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.cg++ -std=c++17 -pedantic -Wall -Wextra test.cpp。两者都不会对a()b()和发出任何警告c()。这是故意的,还是一个错误?

ike*_*ami 6

简短回答:C 警告是一个谜。-Wformat-signedness如果您想在此处出现警告,请使用。

请注意,-Wformat-signedness需要-Wformat,它已由 启用-Wall


-Wformat-signedness显然,编译器仅在使用时检查符号不匹配。-Wall并且-Wextra不包括-Wformat-signedness. 我不知道这是为什么。有人说这是因为它会导致太多警告,但这告诉我如果这是一个如此常见的错误,确实需要使用它!

因此,所检查的只是尺寸不匹配。两个警告 (d和) 会发出警告,因为传递e的类型值可能大于该值。int至于其他两个,signed char和值在传递给 variadric( ) 函数(如 )时short int会提升为值,因此和相当于。int...printfabc