c - printf 如何发出编译器警告?

标签 c gcc printf scanf

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

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

现在,据我所知,printf 和 scanf 是定期实现的可变参数函数,我不知道有什么方法可以在编译时检查字符串的值,更不用说在不匹配时发出警告了。

谁能解释一下我是如何收到编译器警告的?

最佳答案

警告是特定于实现(即编译器和 C standard library )的。您可以让编译器给出很少的警告(查看 tinycc ...),甚至没有...

我正在关注最近的 GCC (例如 4.910 ...)在 Linux 上。

您会收到此类警告,因为 printf用适当的 __attribute__ 声明(参见 GCC function attributes)

(使用 GCC 您同样可以使用 printf 属性声明您自己的类似 format 的函数...)

顺便说一句,符合标准的编译器可以非常特别地免费实现 <stdio.h> header 。所以它可以处理 #include <stdio.h>无需读取任何 header 文件,而是通过更改其内部状态。

您甚至可以添加自己的函数属性,例如通过使用您的 GCC plugin 自定义您的 GCC

关于c - printf 如何发出编译器警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33321751/

相关文章:

c - fork() 导致为每个进程打印列标题

c - 如何在汇编中处理二维数组

android - 为安卓使用 pjsua

c - 不带 "return"命令返回

C(Linux 上的 gcc): How do i convert a hex string "0xfffffff" to an integer?

c - 选择菜单选项后再次打印菜单。 ."do while"选择选项后循环无限

c - 如何在没有 pcap_breakloop 的情况下中断 pcap_loop 循环

java - 如何通过 JNI 将结构从 C 传回 Java

gcc - gcc 的 --sysroot 开关的替代方案?

java - 我认为 printf 和字符串连接;初学者的 future 看起来很黯淡