printf函数中#号的作用

Jminger 2010-01-06 10:46:29
有如下程序:


#ifdef NDEBUG
    #define TRACE(S) S
   #else
    #define TRACE(S) printf("%s;\n", #S); S
   #endif
int main(){

int a=TRACE(5);
printf("a=%d;\n", a);
return 0;
}
编译执行后结果如下:
5;
a=3;

问题:
(1)printf("%s;\n", #S)函数中#号的作用是什么呢?是不是将S格式化为字符串格式?
(2)执行结果a为什么不等于5?

谢谢!
...全文
564 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
traceless 2010-01-07
  • 打赏
  • 举报
回复
学习了 。。我以为是 %#x 之类的。。。
hacker1125 2010-01-07
  • 打赏
  • 举报
回复
学习了,呵呵
hxzwu 2010-01-07
  • 打赏
  • 举报
回复
学习了。。。。
苍蝇①号 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wolffan3150 的回复:]
#进行宏字符串连接
[/Quote]
很有用的功能
Jminger 2010-01-07
  • 打赏
  • 举报
回复
受教了,非常感谢各位!
还是我程序中宏定义的问题。
caoshuming_500 2010-01-07
  • 打赏
  • 举报
回复
学习了
xuzhuo2000 2010-01-07
  • 打赏
  • 举报
回复
字符串宏定义,参考K&R的I\O章节
taohua300 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
请参考下面的代码,自行琢磨……
C/C++ code#define TRACE(S) (printf("%s;\n", #S), S) /*注意用逗号而不是分号*/int main()
{int a=5;int b=TRACE(a);constchar*str="hello";char des[50];
strcpy(des,TRACE(str));
puts(des);
system("pause");return0;
}
[/Quote]
不错
wolffan3150 2010-01-07
  • 打赏
  • 举报
回复
#进行宏字符串连接
东大坡居士 2010-01-07
  • 打赏
  • 举报
回复
学习了~~~~~~~~
fengsha1986923 2010-01-07
  • 打赏
  • 举报
回复
学习了
lzh3ng 2010-01-07
  • 打赏
  • 举报
回复
学习了
mngzilin 2010-01-07
  • 打赏
  • 举报
回复
#进行宏字符串连接
HEHE8737 2010-01-07
  • 打赏
  • 举报
回复
学习了,呵呵
  • 打赏
  • 举报
回复
int a=TRACE(5);

等于

int a=printf("%s;\n", "5");

http://blog.csdn.net/hairetz/archive/2009/11/08/4785047.aspx
jernymy 2010-01-06
  • 打赏
  • 举报
回复

3.宏的单行定义(少见用法)

#define A(x) T_##x

#define B(x) #@x

#define C(x) #x

我们假设:x=1,则有:

A(1)------〉T_1

B(1)------〉'1'

C(1)------〉"1"

(这里参考了 hustli的文章)


int a=TRACE(5); // a = (printf("%s;\n", "5"), 5);


selooloo 2010-01-06
  • 打赏
  • 举报
回复
(1)#是宏的的东东,将#后面的解释为字符串,和printf没关系
TRACE(5);
会被替换为
printf("%s;\n", "S");

(2) a等于printf的返回值,也就是printf打印的个数
a=printf("%s;\n", "S");
这里打印结果是5; '\n'(注意有个回车)
共三个字符,所以a=3
Arnold9009 2010-01-06
  • 打赏
  • 举报
回复
把S变成字符串

#define TRACE(S) printf("%s;\n", #S)

则TRACE(trace) 等效于 printf("%s;\n", "trace")
mstlq 2010-01-06
  • 打赏
  • 举报
回复
请参考下面的代码,自行琢磨……

#define TRACE(S) (printf("%s;\n", #S), S) /*注意用逗号而不是分号*/

int main()
{

int a=5;
int b=TRACE(a);
const char *str="hello";
char des[50];
strcpy(des,TRACE(str));
puts(des);
system("pause");
return 0;
}

70,023

社区成员

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

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