| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3299 人关注过本帖
标题:#define中带参替换的细节问题.替换参数中带双引号出现的问题
取消只看楼主 加入收藏
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
 问题点数:0 回复次数:2 
#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
casio1374633
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2010-3-11
收藏
得分:0 
版主你好,我知道#和##在define中的应用.而且我自己已经解决了那个问题,但是我不理解的是在题目给出的错误中

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

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

我很想知道原因.谢谢

静下心来,做点实事
2010-03-17 21:12
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.039232 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved