标题:一个关于 __LINE__ 和 __FILE__ 的宏不会写,这个练习仅针对高级程序员,太 ...
只看楼主
muyoucumian
Rank: 3Rank: 3
等 级:等待验证会员
帖 子:80
专家分:126
注 册:2014-8-30
结帖率:100%
已结贴  问题点数:20 回复次数:7 
一个关于 __LINE__ 和 __FILE__ 的宏不会写,这个练习仅针对高级程序员,太坑爹了
题目:
如果需要一个宏,使它扩展后包含当前行号和文件名。换而言之,我们想把
const char *str = LINE_FILE;
扩展为
const char *str = "Line 10 of file foo.c";
其中foo.c是包含程序的文件,10是调用LINE_FILE的行号。警告:这个练习仅针对高级程序员。

我第一次写的是这样:
#define LINE_FILE "Line "##__LINE__##" of file"##__FILE__     

我第二次写的是这样:
#define LINE_FILE "Line __LINE__ of file"##__FILE__

统统都不行啊,要崩溃了,求大神解答,这题书上也不给答案。
搜索更多相关主题的帖子: 高级程序员 file 
2014-10-04 09:36
dcl2014
Rank: 4
等 级:业余侠客
威 望:1
帖 子:58
专家分:273
注 册:2014-9-20
得分:0 
不知道呢 坐等大神
2014-10-04 09:53
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
得分:0 
不是很理解你的意思,题目中要求替换宏LINE_FILE为"Line 10 of file foo.c",定义该宏为"Line 10 of file foo.c"就行了

看你的方法,好像是想用连接符号,也可以这样定义:#define LINE_FILE "Line "##"10"##" of file"##"foo.c"

若你想用另外的宏代替字串中10和foo.c,可以这样定义:
#define line "10"
#define file "foo.c"
#define LINE_FILE "Line "##line##" of file"##file

若你想用带参数的宏,可以这样:#define LINE_FILE(line,file) "Line "#line" of file "#file,使用时代入参数即可,如char * pt=LINE_FILE(10,foo.c);

看有没有符合你的情况的。

另外,不建议你用开头带下划线的标识符,因为这些有可能是头文件中的已被使用过的标识符,是属于保留标识符。

坚持----------------------------------唯一的道路
shit ! ! !
2014-10-04 19:27
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
回复 3 楼 wssy213
楼主是想使用 __LINE__ 和 __FILE__

兄台这种办法缺乏灵活性,行号和文件名变更后很麻烦...

楼主这个问题的困难之处在于 预处理 不替换双引号中的内容,而且也不替换 # 和 ## 的操作数,#__LINE__ 只会替换为“__LINE__”...
而 __LINE__ 为整形,__FILE__ 为字符串,要合并成一个字符串,不容易...


莫问前尘有愧,但求今生无悔
2014-10-04 20:56
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
得分:0 
回复 4 楼 pycansi
那你就说出自己的想法啊

坚持----------------------------------唯一的道路
shit ! ! !
2014-10-04 21:18
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:20 
程序代码:
#include <stdio.h>

#define STR(x) #x
#define XSTR(x) STR(x)
#define LINE_FILE "Line " XSTR(__LINE__) " of " __FILE__

int main(void)
{
    const char str[] = LINE_FILE;
    puts(str);
   
    return 0;
}


编译过程

Compilation started at Sat Oct  4 22:04:50

gcc -Wall -march=corei7-avx -Ofast -msse4.2 -mavx -std=c99 macros.c -lm -o macros

Compilation finished at Sat Oct  4 22:04:51

2014-10-04 22:05
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
得分:0 
回复 6 楼 zklhp
兄台这一手漂亮啊,在转字符串前多加一步,使其展开,靓


莫问前尘有愧,但求今生无悔
2014-10-04 22:26
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用pycansi在2014-10-4 22:26:22的发言:

兄台这一手漂亮啊,在转字符串前多加一步,使其展开,靓

谬赞了 C99规范里这么写的 😳
2014-10-04 22:42



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-436848-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.756378 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved