编译预处理(cpp)
程序调试、兼容性、平台移植等情形经常使用。简要介绍C语言的条件编译#if, #elif, #else, #endif、#ifdef, #ifndef常用语法。
宏定义
语法
#define 标识符(Micro) 字符串
//宏定义
#undef 标识符(Micro) 字符串
//取消宏定义
#表示它是一条预处理命令(在C语言中凡是以#开头的均为预处理命令)。字符串可以是常数、表达式、格式串等。
样例
// 不带参数的宏定义
#define MAX 10
/*带参宏定义*/
#define F(y) y*y+3*y
/*宏调用*/
x=F(5);
条件编译方法
(1)#if, #elif, #else, #endif语法
#if condition 1
code 1
#elif condition 2
code 2
...
#elif condition n
code n
#else
code n+1
#endif
(2)#ifdef/#ifndef, #elif, #else, #endif语法
ifdef的一般形式是:
#ifdef macro_name
code 1
#else
code 2
#endif
ifndef的一般形式是:
#ifndef macro_name
code 2
#else
code 1
#endif
两段代码作用等价。
宏函数defined(macro_name)
样例
#if defined(macro1) || (!defined(macro2) && defined(macro3))
...
#else
...
#endif
布尔运算符:“|| 或”,“&& 与”,“! 非”
#ifdef MACRO_1
#ifdef MACRO_2
code a
#endif
#endif
等价于
#if defined(MACRO_1) && defined(MACRO_2)
code a
#endif
#ifdef的使用和#if defined()的用法一致; #ifndef又和#if !defined()的用法一致。#ifdef和 #if defined 的区别在于,后者可以组成复杂的预编译条件。
#if defined (AAA) && defined (BBB)
code c
#endif
#if defined (AAA) || VERSION >12
code d
#endif
而#ifdef就不能用上面的用法,也就是说,当你要判断单个宏是否定义时,#ifdef和 #if defined 效果是一样的;但当你要判断复杂的条件时,则用 #if比较方便。
范例
#define BUFSIZ 1024 //缓冲区大小
#define EOF (-1) //表文件末尾
#ifndef SEEK_SET
#define SEEK_SET 0 //表示文件指针从文件的开头开始
#endif
#ifndef SEEK_CUR
#define SEEK_CUR 1 //表示文件指针从现在的位置开始
#endif
#ifndef SEEK_END
#define SEEK_END 2 //表示文件指针从文件的末尾开始
#endif