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

-2 c printf

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

int main(){
    int a=3,b=4;
    printf("%d,%d");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 5

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

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