C/C++中宏的使用

Posted on 2008-07-16 18:10 RichardHe 阅读(426) 评论(0)  编辑 收藏 引用 所属分类: [转]
关于## 和 #及#@的用法


## 是连接符号 连接两个宏,##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变
量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那就可以使用:宏参数##
固定部分。当然还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的。
#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d
typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);
// 这里这个语句将展开为:
//      typedef struct _record_type name_company_position_salary;


#@功能是将其后面的宏参数进行字符化。
#define makechar(x)  #@x
a
= makechar(b);
//a = 'b';


#是把名字代替成字符串,宏体中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个
双引号。
#define WARN_IF(EXP)        \
        do{ if (EXP)        \
                fprintf(stderr, "Warning: " #EXP "\n"); }       \
        while(0)
那么实际使用中会出现下面所示的替换过程:
WARN_IF (divider == 0);
被替换为
do {
        if (divider == 0)
fprintf(stderr, "Warning" "divider == 0" "\n");
} while(0);
这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。


!IF constantexpression

如果 constantexpression 计算结果为非零值,则处理 !IF 和下一个 !ELSE!ENDIF 之间的语句。
!ENDIF

标记 !IF!IFDEF!IFNDEF 块的结尾。同一行上 !ENDIF 后面的所有文本被忽略。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe