【C语言】“#”号的使用

将记号转化为字符串:
标准C语言中有一种机制可以将宏参数转换为字符串常量。宏定义中出现#记号被当作一元“字符串化”运算符,后面为宏正式参数名,宏扩展期间,#和正式参数名换成相应的包含在字符串引号当中的实际参数。生成字符串时,记号参数表中的每个空白序列转换为一个空格,使用反斜杠的字符保留其原意。
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TEST(a, b) printf(#a "<" #b "=%d\n", (a) < (b))


int main(int argc, char *argv[])
{
    TEST(123, 789);
    return 0;
}

输出为:
tim@tim-pc1:~/develop/temp$ ./a.out 
123<789=1

宏扩展中的记号合并:
标准C语言合并记号形成新记号时,由宏定义中的合并运算符##控制,重新扫描更多宏之前,宏替换将##连接的两个记号合并。因此:##不能放在开头或者结尾,否则结果未定义。
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define TEST2(a)   temp ## a

int TEST2(3) = 10; //创建一个名称为temp3的变量

int main(int argc, char *argv[])
{
    TEST(123, 789);
 
    printf("#TEST2(3) is %d\n", TEST2(3));
    return 0;
}

输出为:

tim@tim-pc1:~/develop/temp$ ./a.out 
#TEST2(3) is 10

查看汇编,可以考到上述代码生成一个名称为temp3的变量

	.globl	temp3
	.data
	.align 4
	.type	temp3, @object
	.size	temp3, 4
temp3:
	.long	10
	.section	.rodata

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值