| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3300 人关注过本帖
标题:#define中带参替换的细节问题.替换参数中带双引号出现的问题
只看楼主 加入收藏
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
 问题点数:0 回复次数:5 
#define中带参替换的细节问题.替换参数中带双引号出现的问题
首先是这个问题的代码:

程序代码:
#include <stdio.h>
#define   PRN(x)   printf("x\n");
int main(void)
{
   PRN(Hello from main());
   return 0;
}
从问题本身可以看到,想要输出Hello from main().
但是在实际输出中,输出的是x.
通过cc -E foo.c 发现被替换的部分出现一个问题.在执行时候的实际程序成了printf("x\n");.

书中的提示说标识符PRN并不是由预处理器产生的.请找出原因并修改代码.

我知道使用"字符串化"可以解决这个问题:

程序代码:
#include <stdio.h>
#define   PRN(x)   printf(#x"\n");   /*此处用  #x  就可以了*/
int main(void)
{
   PRN(Hello from main());
   return 0;
}

但是我不能理解原因,特别是说这个标识符不是由预处理器产生的.我不能理解.请各位帮帮忙,谢谢
搜索更多相关主题的帖子: 细节 参数 define 引号 
2010-03-17 19:04
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 
字符串连接符嘛,MSDN上都有的,你可以看一下
还有这个符号:##

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2010-03-17 20:13
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
得分:0 
版主你好,我知道#和##在define中的应用.而且我自己已经解决了那个问题,但是我不理解的是在题目给出的错误中

#define   PRN(x)   printf("x\n");

为什么没有进行x的替换,如果说""忽略了替换,那么为什么题目的提示中说标识符PRN并不是由预处理器产生的.

我很想知道原因.谢谢

静下心来,做点实事
2010-03-17 21:12
mikelr
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:161
注 册:2010-3-17
收藏
得分:0 
因为:
#define   PRN(x)   printf("x\n");
不论PRN(x)  这里的x是什么东西,输出的都是 x.
它只是单纯的替换

PRN(123) 展开 printf("x\n");输出就是x

#define   PRN(x)   printf("%s\n",x);

PRN("Hello from main()");  这样就可以输出了
2010-03-17 21:31
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
查MSDN
The #define directive substitutes token-string for all subsequent occurrences of an identifier in the source file. The identifier is replaced only when it forms a token. (See C++ Tokens in the C++ Language Reference.) For instance, identifier is not replaced if it appears in a comment, within a string, or as part of a longer identifier.

标识符PRN并不是由预处理器产生的.
这个不知道什么意思。。

离恨恰如春草,更行更远还生。
2010-03-17 21:43
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
得分:0 
谢谢楼上.在我的理解,下面这句

identifier is not replaced if it appears in a comment, within a string, or as part of a longer identifier.

应该是说在define以后如果在后面的代码中

是这样的部分是不被替换的,例如:   /*PRN(A)*/   "PRN(A)"   abcdPRN(A)都是不会被替换的.

但是本题的例子中出现了一个可以被替换的REN , 只是说他的参数没有被后面替换掉.或者说参数被屏蔽了.那么在程序中不论出现什么PRN(anything).中间的部分都不会被替换.

我想了解的就是书中针对这个给出了提示说这个REN不是由预处理器产生的.而且特别提示说用gcc -E 来详细查看
这个问题的英文原文如下:
Note that the identifier PRN does not get generated by the preprocessor.

静下心来,做点实事
2010-03-17 22:03
快速回复:#define中带参替换的细节问题.替换参数中带双引号出现的问题
数据加载中...
 
   



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

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