欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于gcc的扩展宏定义中, "#" 和 "##"的含义

程序员文章站 2022-06-10 14:17:01
...

"#"  代表和一个字符串相连接

 "##"  代表和一个符号相连接,符号可以是变量,或另一个宏符号

举例如下:

#include<stdio.h>

#define FILE_NAME "/dev/tty"

#define FILE_NAME2 "/dev/console"


// '#' use example
#define FILE_OPEN1(fd,n) \
{ \
	fd = open(FILE_NAME#n,O_RDWR); \
	if(fd < 0){ \
	printf("open tty error\n"); \
		return 0; \
	} \
}

// '##' use example
#define FILE_OPEN2(fd,n) \
{ \
	fd = open(FILE_NAME##n,O_RDWR); \
	if(fd < 0){ \
	printf("open tty error\n"); \
		return 0; \
	} \
}


int main(void)
{
	FILE_OPEN1(fd1, 1);
	FILE_OPEN1(fd2, 2);
	FILE_OPEN1(fd3, 3);

	FILE_OPEN2(fd4, 1);
	FILE_OPEN2(fd5, 2);
	FILE_OPEN2(fd6, 3);
	return 0;
}

预编译处理:

[email protected]:~/Music$ gcc -E main.c -o main.i

执行后,打开main.i :

底部:

int main(void)
{
 { fd1 = open("/dev/tty""1",O_RDWR); if(fd1 < 0){ printf("open tty error\n"); return 0; } };
 { fd2 = open("/dev/tty""2",O_RDWR); if(fd2 < 0){ printf("open tty error\n"); return 0; } };
 { fd3 = open("/dev/tty""3",O_RDWR); if(fd3 < 0){ printf("open tty error\n"); return 0; } };


 { fd4 = open(FILE_NAME1,O_RDWR); if(fd4 < 0){ printf("open tty error\n"); return 0; } };
 { fd5 = open("/dev/console",O_RDWR); if(fd5 < 0){ printf("open tty error\n"); return 0; } };
 { fd6 = open(FILE_NAME3,O_RDWR); if(fd6 < 0){ printf("open tty error\n"); return 0; } };
 return 0;

}

以上,可以看到:

“#”即先展开左右的宏,再以字符串形式拼接起来

“##”即先拼接左右的字符串,再根据拼接起来的结果是不是宏再另行展开