繁体   English   中英

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

[英]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.cg++ -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 我不知道这是为什么。 有人说是因为它会导致太多警告,但这告诉我,如果它是一个常见的错误,它确实需要使用!

因此,所有正在检查的都是大小不匹配。 警告的两个( de )警告是因为正在传递可能大于int的类型值。 至于其他两个, signed charshort int值在传递给printf等可变参数 ( ... ) 函数时会提升为int值,因此ab等效于c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM