printf/sprintf编译器警告是否有概念上的突破?

Bla*_*iev 4 c compiler-construction printf warnings

我注意到,当printf/sprintf函数的格式字符串中的转换说明符与相应参数的类型或计数不匹配时,大量C编译器会发出警告.

在我看来,这似乎是一个概念上的突破,因为根据语言规范,C没有内置函数.

所有编译器都应该知道printf/sprintf是他们的原型而不是他们的语义.我知道printf/sprintf是标准的C函数,但是它们存在于一个单独的库libc中,你必须包含stdio.h才能导入它们的原型.

许多编译器所做的是分析格式字符串,该格式字符串也可以在运行时提供.

以上是否有意义?

Ste*_*sop 11

"所有编译器都应该知道printf/sprintf是他们的原型,而不是他们的语义".

这是不正确的部分.就标准而言,C实现的任何部分都"被允许"了解任何其他部分,并发布可能对用户有帮助的诊断.标准不要求编译器内在函数,这也不是特定的诊断,但它们当然不是禁止的.

请注意(就标准而言)标准库是特殊的,它不仅仅是任何旧的链接库.如果特定的实现/编译器甚至为用户提供了一种链接不同版本的标准库的机制,那么当该替代库具有与其中所列出的语义不同的语义时,该标准当然不要求它"工作".标准.

所以在这个意义上,标准库中的所有内容都是"bult-ins".它是C语言规范的一部分.允许编译器在假设其行为符合标准要求的情况下执行操作.

当然,如果格式说明符在运行时才知道,那么编译器就无法对varargs进行静态检查.但是当它在编译时已知时,编译器可以假设行为printf与它可以假定行为memcpy或整数加法一样有效.