了解c语言中的宏

宏定义的优点

  1. 增强程序的可读性,易于修改.
  2. 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率.
  3. 宏是编译前处理的.

简单上手

1.最简单的  宏只作替换,不做计算 

//定义一个宏 格式 #define 宏名称  字符串
#define N 10

int main(int argc, char *argv[])
{
	int num = N;	
	return 0;
}

用gcc 查看预编译之后的内容 gcc -E define.c -o define.i

//删除了stdio头文件内容,发现N在预编译的时候,进行了替换
int main(int argc, char *argv[])
{
 int num = 10;
 return 0;
}

2.有参数的宏

//有参数的宏
#define show(x) printf("x=%d\n",x);

int main(int argc, char *argv[])
{
	show(10)
	return 0;
}

3.多行的时候,应该这样写

#define func() printf("count 1\n"); \
	       printf("count 2\n"); \
	       printf("count 3\n");
int main(int argc, char *argv[])
{
	func()
	return 0;
}

看mono是这样使用的

#define SET_APPDOMAIN(x) do {						\
		MonoThreadInfo *info;					\
		mono_native_tls_set_value (appdomain_thread_id, x);	\
		mono_gc_set_current_thread_appdomain (x);		\
		info = mono_thread_info_current ();				\
		if (info)						        \
			mono_thread_info_tls_set (info, TLS_KEY_DOMAIN, (x));	\
	} while (FALSE)

4. 多个参数的时候

#define MAX(x,y) x>y?x:y;

5. #在宏使用

#define TEST(x)  printf("%s\n",#x);

在预编译的文件查看#号是干嘛的,发现#号会内容当成字符串处理

int main(int argc, char *argv[])
{
 printf("%s\n","main");
 return 0;
}

6.##在宏使用

#define a() a##x()
void a1()
{
	puts("a1");
}
int main(int argc, char *argv[])
{
	a(1);     //调用
	return 0;
}

看预编译,发现##其实是连接

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

7. #@在宏使用 跟##类似,只不过当做字符

#define PRINTCHAR(c) #@c


秋风 2016-08-11