了解c语言中的宏
宏定义的优点
- 增强程序的可读性,易于修改.
- 提高程序的运行效率:使用带参的宏定义既可完成函数调用的功能,又能避免函数的出栈与入栈操作,减少系统开销,提高运行效率.
- 宏是编译前处理的.
简单上手
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