宏定义中的#、##和#@符号

来源:互联网 发布:进销存 知乎 编辑:程序博客网 时间:2024/04/29 19:32

1、# 字符串化操作符
   其作用是:将宏定义中的传入参数名转换成用一对双引号括起来的参数名字符串。
   其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
   如:
        #define TEST_MACRO1(para) printf("Welcome to the C world, %s!\n", #para)
   当使用该宏定义时:
        TEST_MACRO1(ligt);
        在编译时将会展开成:printf("Welcome to the C world, %s!\n", "ligt");
   注意(对空格的处理):
        (1)忽略传入参数名前面和后面的空格,如:
             TEST_MACRO1(  ligt  );也会被展开成:printf("Welcome to the C world, %s!\n", "ligt");
        (2)当传入参数名间存在空格时,编译器将会自动连接各个子字符串,并以一个空格连接各个子字符串,
             忽略其中多余的空格,如:
             TEST_MACRO1(  know   pig   xia   );被展开成:printf("Welcome to the C world, %s!\n", "know pig xia");

2、## 符号连接操作符
   宏定义中,参数名即为形参,如:#define sum(a, b) ((a) + (b))
   其中a和b均为某一参数的代表符号,即形式参数。而##的作用则是将宏定义中的多个形参组成一个实际参数名。
   如:
        char *username1 = "ligt";
        #define TEST_MACRO2(para) printf("Welcome to the C world, %s!\n", username##para)
   当使用该宏定义时:
        TEST_MACRO2(1);
        在编译时将会展开成:printf("Welcome to the C world, %s!\n", username1);
   注意:
        (1)当用##连接形参时,##前后的空格可有可无。
        (2)连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。

3、#@ 字符化操作符
   只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。作用是将传的单字符参数名转化成字符,
   以一对单引号括起来。如:
        #define MAKECHAR(x)
#@x
        char ch = MAKECHAR(a);
        展开后变成:char ch = 'a';
    注意:
        该操作符用gcc、g++编译时都报错,应该是不支持,但在vc 6.0上编译运行都没有问题。

原创粉丝点击