##宏

转载 2008年09月28日 19:31:00

注:原文由Pthread发表于西安交通大学兵马俑BBS,转载请保留此信息。

http://bbs.xjtu.edu.cn/BMYHZGNLVSWCXFTOHGOWXNNLMEHACNIBZUPM_I/con?B=C_Cpp&F=M.1208265882.A&N=6510&T=-3793

http://bbs.xjtu.edu.cn/BMYHZGNLVSWCXFTOHGOWXNNLMEHACNIBZUPM_I/con?B=C_Cpp&F=M.1208272831.A&N=6524&T=0

 

发信人: shaofeng (恨关羽不能张飞喜八戒终得悟空), 信区: C_Cpp

标题: 请教这几种宏定义区别

发信站: 兵马俑BBS (Tue Apr 15 17:35:26 2008), 本站(bbs.xjtu.edu.cn)

 

#define __D(fmt, args...) fprintf(stdout, "Debug: " fmt, ## args)

#define __E(fmt) fprintf(stderr, "Debug: " fmt)

#define __C(fmt, args...) fprintf(stdout, "Debug: " fmt,args)

 

 

发信人: pthread (ZZ), 信区: C_Cpp

标题: Re: 请教这几种宏定义区别

发信站: 兵马俑BBS (Tue Apr 15 21:24:42 2008), 本站(bbs.xjtu.edu.cn)

 

是这样的

1. stdout, stderr //这个就不说了吧

2. 参数个数不同

3. ## 连接符可以在预编译的时候去掉前面的逗号

说仔细点应该是: "##"出现在逗号和变量参数之间时,如果变量整个被忽略的时候,##前面的逗号会被去掉,但是变量不能为空,也就是说__D(fmt,) __C(fmt,)都是不允许的。__C(fmt)不行,而__D(fmt)则是可以的。

 

看两个例子就知道怎么用的了:

1.

#include <stdio.h>

 

#define __D(fmt, args...) fprintf(stdout, "Debug: " fmt, ## args)

#define __E(fmt) fprintf(stderr, "Debug: " fmt)

#define __C(fmt, args...) fprintf(stdout, "Debug: " fmt,args)

 

int main(){

    __E("A vital error occurred./n");

    __C("A vital error occurred at %s : %d./n",__FILE__,__LINE__);

    __D("A vital error occurred at %s : %d./n",__FILE__,__LINE__);

    return 0;

}

 

输出为:

Debug: A vital error occurred.

Debug: A vital error occurred at test.c : 9.

Debug: A vital error occurred at test.c : 10.

 

gcc -o test.i -E test.c,打开test.i查看预处理(宏展开)结果

int main(){

    fprintf(stderr, "Debug: " "A vital error occurred/n");

    fprintf(stdout, "Debug: " "A vital error occurred at %s, %d/n","main.c",9);

    fprintf(stdout, "Debug: " "A vital error occurred at %s, %d/n","main.c",10);

    return 0;

}

 

E CD的区别清楚了吧,这里C,D看来是一样的。

 

再看一个例子:

*****************************************************************

2.

#include <stdio.h>

 

#define __D(fmt, args...) fprintf(stdout, "Debug: " fmt, ## args)

#define __E(fmt) fprintf(stderr, "Debug: " fmt)

#define __C(fmt, args...) fprintf(stdout, "Debug: " fmt,args)

 

int main(){

    __E("A vital error occurred./n");

    __C("A vital error occurred./n");

    __D("A vital error occurred./n");

    return 0;

}

 

此时编译不过,问题在__C。还是用gcc -o test.i -E test.c,得到预处理结果

int main(){

    fprintf(stderr, "Debug: " "A vital error occurred./n");

    fprintf(stdout, "Debug: " "A vital error occurred./n",); //注意这里的逗号

    fprintf(stdout, "Debug: " "A vital error occurred./n");

    return 0;

}

 

所以在参数为空的时候,__C编译失败,__D通过。

明白CD的区别了吧。

 

 

补充两句:

 

1. 关于参数省略和参数为空

对于#define __D(fmt, args...) fprintf(stdout, "Debug: " fmt, ## args)

__D(fmt)是参数省略, gcc会去掉##前面的逗号,编译通过

__D(fmt , )是参数为空,##前面的逗号不会被去掉,编译错误

 

2.  gcc __D(fmt)的处理(去掉前面的逗号)是符合c99标准的。但是如果有下面的例子(虽然程序本身没什么意义)

#include <stdio.h>

#define __D(args...) fprintf(stdout, "DEBUG: %s/n", ##args)

 

int main(){

    __D();

    return 0;

}

 

__D() 没有参数,所以既可以理解为参数省略,也可以理解为参数为空,按c99的标准这种情况下,逗号应该保留。然而gcc默认会去掉逗号。

gcc test.c -o test          //通过

gcc test.c -o test -std=c99 //c99标准,编译错误, fprintf(stdout, "DEBUG: %s/n",);

gdb调试宏定义并显示宏定义的值

宏定义#define APLLCON0 *((volatile unsigned int *)0xFF500100)
  • zhangjs0322
  • zhangjs0322
  • 2014年09月29日 11:10
  • 6797

C语言宏中"#"和"##"的用法

C语言宏中"#"和"##"的用法   在查看linux内核源码的过程中,遇到了许多宏,这里面有许多都涉及到"#"和"##",因此,在网上搜索了一些资料,整理如下:   一、一般用法 我们...
  • maochengtao
  • maochengtao
  • 2015年08月03日 00:06
  • 2218

[VisualStudio]_[增加自定义宏,自定义属性键值]

场景: 1. vs C++的“预处理器”里可以添加宏,但是添加之后外部程序修改并不容易,因为它添加到.vcxproj文件里了,这个文件的东西比较多,并不容易进行修改. 2.所以vs还有一个“属性管...
  • infoworld
  • infoworld
  • 2014年05月03日 20:25
  • 5304

实现按行控制插入删除,插入行后单元格合并以及单元格动态条件公式计算的Excel宏示例

  • 2018年01月14日 21:10
  • 42KB
  • 下载

深度学习介绍 李宏毅 ppt

  • 2018年01月12日 10:37
  • 23.65MB
  • 下载

李宏毅 机器学习 课程 2016 课件集合

  • 2018年01月12日 22:42
  • 87.3MB
  • 下载

win3.3中的宏记录器

  • 2014年10月07日 09:48
  • 19KB
  • 下载

工业DTU与台湾永宏PLC连接上下载程序方案

  • 2016年07月12日 09:01
  • 550KB
  • 下载

a83t_android4.4_20161028_1026钜宏的可以点亮LCD了激进模式可以显示了小字体可以进菜单必须重新编译uboot最简单.7z

  • 2016年10月28日 11:30
  • 86KB
  • 下载

图像处理中的一些必须的宏文件

  • 2016年04月21日 11:26
  • 2.85MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:##宏
举报原因:
原因补充:

(最多只允许输入30个字)