Printf在下面的代码中抛出警告而不是错误

时间:2018-03-23 15:23:18

标签: c printf

为什么编译器只为这个错误的程序产生警告而不是错误?

int main(){
    int a=3,b=4;
    printf("%d,%d");
    return 0;
}

1 个答案:

答案 0 :(得分:5)

您的程序有未定义的行为。由于printf是一个可变函数,因此这里没有约束违规,因此甚至不需要编译器产生警告,更不用说错误了。除非可以证明在程序的任何执行期间达到调用未定义行为的语句,否则它不会产生错误;在你的情况下这是真的,但它只适用于最小的玩具例子,不值得尝试特殊情况。

请注意,对于非可变参数函数,具有错误参数数量的调用是违反约束的,这意味着编译器需要发出警告("生成诊断")并且可能会产生错误并拒绝编译该程序。