网站购买域名之后再怎么做,基本的网站建设知识,源码下载39源码网,北京网络推广套餐文章目录 宏定义无参宏定义带参宏定义固定参数宏可变参数宏 多语句宏处理连接符条件判断常见预定义宏 宏在C语言中是一段有名称的代码片段#xff08;使用#define定义#xff09;#xff0c;在预处理阶段会把程序中的宏名替换为对应的代码片段#xff0c;然后才进入编译阶段… 文章目录 宏定义无参宏定义带参宏定义固定参数宏可变参数宏 多语句宏处理连接符条件判断常见预定义宏 宏在C语言中是一段有名称的代码片段使用#define定义在预处理阶段会把程序中的宏名替换为对应的代码片段然后才进入编译阶段由编译器进行编译。 #define宏定义#undef取消宏定义#ifdef判断宏是否定义
宏定义
无参宏定义
最简单的宏定义时间用指定的标识符来代表代码片段当宏定义有多行时需要在行尾使用\来连接。
#define 宏名称 代码片段// 如多行时行尾使用\作为续行符
#define BUFFER_SIZE 1024
#define RANDOM (2.0*(double)rand() / RAND_MAX)
#define NUMBERS 1, \2, \3int x[] { NUMBERS };带参宏定义
类似函数定义宏名称后紧跟括号名称与括号间不能有空格。
固定参数宏
“形参列表”是用逗号隔开的多个标识符也可以空表示无参数实参列表中的实参数量必须与宏定义中的形参数量一样多。
#define 宏名称( [形参列表] ) 替换文本
// 如
#define GETCHAR() getc(stdin)
#define MAX(a,b) ((a)(b)?(a):(b))
//参数要用括号括起避免实参为表达式时出错如
#define MULTIPLY(a, b) ((a)*(b))
//MULTIPLY(12, 34)会预处理为((12)*(34))若不加括号则会变为12*34意义全变。即使加括号宏在一定情况下还是会产生二义性要避免此类使用如
#define SQUARE(a) ((a)*(a))SQUARE(a)会预处理为((a)(a))若a3则结果为34。
可变参数宏
C99标准允许定义有省略号的宏在替换文本中使用__VA_ARGS__标识可变参数省略号必须放在参数列表的最后面表示可变参数。
#define OUTLOG(fmt, ...) printf(__func__, fmt, __VA_ARGS__)多语句宏处理
对于有多条语句的复杂宏为避免错误需要使用do{}while(0)包含避免出现多余分号等的报错。
#define SAFE_DELETE(ptr) \do{ \if(NULL ! ptr){ \delete ptr; \ptrNULL; \} \}while(0)连接符
在宏体中通过在参数前面加不同符号会有不同的扩展
#参数扩展为字符串形式##连接符把两部分连接为一个标识符#参数扩展为字符 通过这些连接符可以实现一些复杂的操作如MFC中自动生成类等
#define CHAR_VAR(n, c) char var##n #c
#define ARRAY_VAR(n, str) char ary##n[] #str// char varaa;
CHAR_VAR(a, a);
// char arya[]abc;
ARRAY_VAR(a, abc);条件判断
条件编译里面有判断语句如 #if 、#else 、#elif 及 #endif。类似if语句在里面可以使用与、或、非及比较表达式。通过条件判断可以使代码适应不同的运行环境针对不同环境编译不同代码部分。
//#ifdef 是 #if defined的简写
#if defined(X_OS_WIN32) || defined(X_OS_WIN64)
// Windows代码处理...
#endifVC中判断当前是否为Debug
#ifdef _DEBUG
#pragma comment(lib, my-debug.lib)
#else
#pragma comment(lib, my-release.lib)
#endifC中定义标准C接口使用extern “C”
#ifdef __cplusplus
extern C{
#endif// ... 代码#ifdef __cplusplus
}
#endif
在判断是否满足指定要求#if defined(MY_TEST_VER) (MY_TEST_VER2)
// ...
#endif常见预定义宏
预定义宏
__DATE__: 字符串, 进行预处理的日期(Mmm dd yyyy, 如May 27 2006)
__TIME__: 字符串, 源文件的编译时间(hh:mm:ss, 如09:11:10)
__FILE__: 字符串, 代表当前源代码文件名(包含详细路径, 如F:/a.c)
__LINE__: 整数值, 代表当前源代码文件中的行号
__STDC__: 布尔值, 为1时表示该实现严格遵循ANSIC标准
__STDC_VERSION__: 长整型值, 表示编译器所遵循的C标准的版本号(yyyymmL,如199101L)
__func__: 字符串, 当前所在函数名(C99标准)
__PRETTY_FUNCTION__: 在C中, 同__func__; 而在C中, 则记录了当前函数的头信息
__VA_ARGS__: 保存了可变参数列表 …
__cplusplus: 长整型值, 表示了C的版本号(yyyymmL, 如199711L)