printf如何发出编译器警告?

use*_*881 10 c printf gcc scanf

我想知道函数如何发出编译时警告?

我想到了这一点,因为当我们在printf(scanf)的第一个参数中为与该类型说明符匹配的变量提供错误的格式说明符并使用带有-Wall选项的gcc进行编译时,编译器会发出警告.

现在,printf和scanf定期实现可变参数函数,据我所知,我不知道在编译时检查字符串值的任何方法,更不用说在某些内容不匹配时发出警告.

有人能解释我如何获得编译器警告吗?

Bas*_*tch 9

警告是特定的实现(即编译器和C标准库).你可以让一个编译器提供很少的警告(看看tinycc ......),甚至没有...

我专注于Linux 上最近的GCC(例如4.95.2 ......).

你得到这样的警告,因为printf用适当的声明__attribute__(参见GCC 函数属性)

(使用GCC,您也可以printf使用format属性声明自己的函数...)

顺便说一下,符合标准的编译器可以自由地特别实现<stdio.h>头文件.因此它可以在#include <stdio.h>不读取任何头文件的情况下处理,但可以通过更改其内部状

您甚至可以添加自己的功能属性,例如通过MELT自定义GCC

  • @ user1635881是的 - 考虑到这一点,这真的是一个明智的做法:`printf()`不仅是标准的一部分,它还有一个众所周知的*格式字符串*的合同(甚至用于相当的一些自定义函数)可以进行*某些*静态诊断,所以为什么不向程序员提供调试辅助. (3认同)

chu*_*ica 6

printf 如何发出编译器警告?

有些编译器分析的格式和其他参数类型printf(),并scanf()在编译时。

printf("%ld", 123);  // type mis-match  `long` vs. `int`
int x;
printf("%ld", &x);  // type mis-match 'long *` vs. `int *`
Run Code Online (Sandbox Code Playgroud)

但是,如果计算格式,则不会进行该检查,因为它是运行时问题。

const char *format = foo();
printf(format, 123);  // mis-match? unknowable.
Run Code Online (Sandbox Code Playgroud)