关于预处理__LINE__的问题

handanxuebu_2016 2016-04-09 07:24:18
大侠们好,我是新手,刚刚起步开始自学c。
今天学到预处理这节,其中有道题要求定义一个宏LINE_FILE,把
const char * str = LINE_FILE ;
扩展为
const char * str = "Line 10 of file foo.c" ;
其中10由__LINE__获得,foo.c由__FILE__获得。
这个__LINE__和__FILE__在printf函数中很容易实现,但要把__LINE__获得的行号转换成字符串字面量赋值给数组怎么实现啊?
我折腾了几天也没弄出来,在网上查也查不到!
烦请各位大侠、高手指条活路啊!!!
跪谢!!!
...全文
117 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
handanxuebu_2016 2016-04-09
  • 打赏
  • 举报
回复
非常感谢!我之所以转不出来就是因为一直试图在程序代码里传递参数__LINE__给宏,但始终都不会传递行号,而只是传递字符__LINE__;即便先赋值__LINE__给变量再传递参数也不行(就是没想到在指令里再定义一个宏做中间桥梁) 而在宏定义里使用#__LINE__也只能得到#40而不是“40”。 再次表示感谢!!!
chehw_1 2016-04-09
  • 打赏
  • 举报
回复
引用 2 楼 handanxuebu_2016 的回复:
感谢大侠!!!!!实在是太感谢了!!!! 是不是可以这样理解: 宏定义在从程序中接受参数时始终都是直接将参数替换过去,而未进行运算; 仅当从嵌套宏定义中接受参数时才进行运算并替换(书中指“明示常量”)? 也就是说预处理器在进行宏替换时仅对指令进行明示常量计算并替换程序代码,而不对程序本身进行计算?
过多的文字表述容易把简单问题复杂化。直接看一下展开的流程: STR(__LINE__) ==> INT_STR(line_no) 编译器在处理STR(__LINE__)时,因为此时的宏定义中没有“#”号,所以编译器会先将__LINE__这一宏替换为对应的数值(行号,假设为40),进而再去解析 INT_STR(40),编译器处理在#40时,会将后面的整数40展开为字符串”40“,然后就可以得到预期的结果。 之所以定义两个宏,是因为在第一次展开时需要获取__LINE__的数值。如果只用一个宏,#__LINE__ 会被替换为"__LINE__"
handanxuebu_2016 2016-04-09
  • 打赏
  • 举报
回复
感谢大侠!!!!!实在是太感谢了!!!! 是不是可以这样理解: 宏定义在从程序中接受参数时始终都是直接将参数替换过去,而未进行运算; 仅当从嵌套宏定义中接受参数时才进行运算并替换(书中指“明示常量”)? 也就是说预处理器在进行宏替换时仅对指令进行明示常量计算并替换程序代码,而不对程序本身进行计算?
chehw_1 2016-04-09
  • 打赏
  • 举报
回复


#define INT_STR(x) #x
#define STR(x) INT_STR(x)

#define LINE_FILE "Line " STR(__LINE__) " file " __FILE__

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧