请教下C中printf的具体实现原理

[复制链接]
1125|9
手机看帖
扫描二维码
随时随地手机跟帖
过路人1024|  楼主 | 2019-12-17 11:25 | 显示全部楼层 |阅读模式
本帖最后由 过路人1024 于 2019-12-17 11:30 编辑

其实我主要是搞不懂为什么这个函数能让编译器报这个警告:Warning[Pe224]: the format string requires additional arguments C:\Users\Administrator\Documents\IAR_Project\stdarg_test\main.c 7
我知道这个警告什么意思、是什么原因导致的。
--------------------------------------------------------------------------------------
#include <stdio.h>
void main(void)
{
  printf("test%d");
  while(1);
}
--------------------------------------------------------------------------------------
按理说函数printf第二个参数之后都是可变参数,根据语法规则完全可以不加的吧。但是它为什么能凭借%d来判断没有第二个参数是有问题的呢?(甚至能判断有没有可变参数)这个在预处理阶段还是编译阶段发现的?编译器给出的警告或错误应该都是根据C语法规则判断的吧,理论上printf("test%d")也是符合语法的吧?
我知道可变参数的用法,但是据我所知C库stdarg并不能判断可变参数的数量,然而printf感觉不仅能判断,还能给出警告。所以这到底怎么实现的呢?

使用特权

评论回复

相关帖子

过路人1024|  楼主 | 2019-12-17 14:22 | 显示全部楼层

使用特权

评论回复
过路人1024|  楼主 | 2019-12-17 21:23 | 显示全部楼层

使用特权

评论回复
GeekyGeek| | 2019-12-18 12:52 | 显示全部楼层

使用特权

评论回复
sjnh| | 2019-12-18 14:38 | 显示全部楼层
百度,“printf源码”

使用特权

评论回复
ayb_ice| | 2019-12-18 17:03 | 显示全部楼层
%d需要对应的参数,人家好心提示你,你还不买账

使用特权

评论回复
airwill| | 2019-12-22 18:27 | 显示全部楼层
输出参数不匹配嘛

使用特权

评论回复
dengweian| | 2019-12-28 11:01 | 显示全部楼层
C语言的%是运算符,提示你没有运算条件,不是说你一定错误,IAR也让你编译,你要这样用也不反对你,你追溯一下这个函数的方法

使用特权

评论回复
steelen| | 2019-12-30 10:20 | 显示全部楼层
printf("test%d",XX);
需要增加XX这个参数

使用特权

评论回复
steelen| | 2020-1-7 09:50 | 显示全部楼层
我曾经自己重写过 printf函数,用argc和argv两个参数吧。时间久了记不得了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

39

帖子

0

粉丝