首页 新闻 会员 周边 捐助

C语言宏展开

0
悬赏园豆:20 [已解决问题] 解决于 2016-12-03 09:42

头文件里有下面的定义:

10 #ifndef INTERFACE_VERSION
11    #define INTERFACE_VERSION __LINE__
12 #else
13     #error "INTERFACE_VERSION was defined elsewhere!"
14 #endif

期望源文件包含该头文件后,得到的INTERFACE_VERSION是11,而不是访问处的代码行。

例如:

25 printf("INTERFACE_VERSION=%d", INTERFACE_VERSION);

打印INTERFACE_VERSION=11而不是25。

请问INTERFACE_VERSION宏应该怎么定义呢?

C
clover_toeic的主页 clover_toeic | 初学一级 | 园豆:62
提问于:2016-12-02 09:19
< >
分享
最佳答案
1

__LINE__是C中预定义的宏,标识当前的所在行,它总是会在编译时解析成当前行的数值。而宏定义的特性是编译时将宏替换成宏主体,并不会解析宏主体的值,这不像变量可以动态赋值。

以你的情况为例,在25行使用了INTERFACE_VERSION,是在11行定义的,所以此时的__LINE__是11,从而11行会被替换成:

  #define INTERFACE_VERSION 11

故而25行将会解析成:

  printf("INTERFACE_VERSION=%d", 11);

如果想要获得11行的结果,你可以考虑在11行的位置用变量记录当前的__LINE__值,后续再使用该变量就可以,如:

  const int temp = __LINE__;

  printf("INTERFACE_VERSION=%d", temp);

收获园豆:20
xiangqian010 | 菜鸟二级 |园豆:222 | 2016-12-02 09:41

谢谢xiangqian010,定义变量的方法正是我后来想到的。分就给你啦!

clover_toeic | 园豆:62 (初学一级) | 2016-12-03 09:42
其他回答(1)
0

 头文件是包含在源文件中的,并且是宏是预编译的,__LINE__肯定是指预编译之后的行数,

悦光阴 | 园豆:2251 (老鸟四级) | 2016-12-02 09:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册