连接符号:#、##

#是字符串连接符

##是两个变量的连接符

/// well.c
#ifndef __WELL_H__
#define __WELL_H__

#define check_cond(exp, err_ret) \
	do {\
		if (!(exp))\
		{\
			fprintf(stderr, "%s:%d:%s, not match condition:"#exp"\n",\
				__FILE__, __LINE__, __FUNCTION__);\
				return err_ret;\
		}\
	}while\(0);
	
#define PRINT_VALUE(n) printf("value"#n":%d\n", value##n);
int main()
{
	int value1 = 1;
	int value2 = 2;
	
	PRINT_VALUE(1);	//编译时宏展开成printf("value1=%d\n", value1);
	PRINT_VALUE(2); //编译时宏展开成printf("value2=%d\n", value2);
}
#endif


执行结果为:

value1=1

value2=2


注意:

#exp等效于"exp",#是字符串连接符

exp1##exp2等效于exp1exp2,##是将两个表达式连接起来成为一个表达式


#和##完全不是一个同等级功能的两者,不要混淆了。


可以通过查看well.c的编译后的文件,查看#和##编译后的内容:

$g++ -E ./well.c > preproc.cpp

$cat -n ./preproc.cpp | less 

截图得到#和##编译后的内容

连接符号:#、##_第1张图片

从上面可以看出来

PRINT_VALUE(1);

被编译为上图中的963行

PRINT_VALUE(2);

被编译为上图中的964行


(END)

你可能感兴趣的:(连接符号:#、##)