您的位置:首页 > 编程语言 > C语言/C++

C宏定义#和##的用法

2015-07-22 14:50 435 查看
1、#是用来把变量名转换为字符串的,例如:

#define print(val) printf(#val"=%d\n", val)

int main()
{
int a = 14;
print(a);
return 0;
}通过预编译:gcc -E test.c -o test.i
得到结果:

int main()
{
int a = 14;
printf("a""=%d\n", a);
return 0;
}其作用相当于为输入值添加了一对双引号。
2、##用于连接字符,例如

#define NAME(no) name_##no

int main()
{
int NAME(1) = 1;
int NAME(2) = 2;
int NAME(3) = 3;
return 0;
}
通过预编译:gcc -E test.c -o test.i

得到结果:

int main()
{
int name_1 = 1;
int name_2 = 2;
int name_3 = 3;
return 0;
}
需要注意的有两点:
(1)此处的no不能为加引号的字符串,否则会提示无效的预处理符号。

(2)而是存在宏嵌套的情况,如下:

#define ONE 1
#define TWO 2

#define NAME(no) name_##no

int main()
{
int NAME(ONE) = 1;
int NAME(TWO) = 2;
return 0;
}对应预处理结果:
int main()
{
int name_ONE = 1;
int name_TWO = 2;
return 0;
}
并不符合预期,处理方法是加一层宏定义:
#define ONE 1
#define TWO 2

#define _NAME(no) name_##no
#define NAME(no) _NAME(no)

int main()
{
int NAME(ONE) = 1;
int NAME(TWO) = 2;
return 0;
}结果如下:
int main()
{
int name_1 = 1;
int name_2 = 2;
return 0;
}符合预期。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  宏定义 c语言 ##