1.含义
对一个程序的某些部分进行条件编译,多用于一个程序有多个版本的情况。
2.用法
预处理器条件:
if行 文本 elif 部分 else 部分 #endif
if行:
- #if 常量表达式
- #ifdef 标识符
-#ifndef 标识符
elif 部分:
- else行 文本 elif部分
elif 行:
- #elif 常量表达式
else 部分:
- else 行 文本
else 行:
- #else
以上是条件编译的语法形式,其中,每个条件编译指令在程序中均单独占一行。 预处理依次对#if以及后续的#elif行中的常量表达式进行计算,直到发现某个指令的常量表达式为非0值为止,这时将放弃值为0的指令行后面的文本。常量表达式不为0的#if和#elif指令之后的文本按照其他普通程序代码一样进行编译。在这里,”文本”是指任何不属于条件指令结构的程序代码,它可以包含预处理指令,也可以为空。
2.1用法示例1
3.使用条件编译容易发生的问题
#define THREE
int main(int argc, char *argv[])
{
#ifdef FRIST
printf("FRIST\n");
#elif define SECOED
printf("SECOND\n");
#elif define THREE
printf("THREE\n");
#endif
return 0;
}
编译报错:
[Error] 未命名1.cpp:11:15: missing binary operator before token "SECOED"
原因分析:上面说的是在”SECOED”之前缺少二进制操作符,出现这种情况的时候,从错误原因找出解决办法,而且整个代码感觉完全没有错(别人都这这样用的,到我这里就出错啊)。其实是define少了一个d,在C语言中:
define:是宏定义标识符,预处理器会把标识符后续出现的代码用给定的记号序列替换掉,就是文本替换。
defined:检查某个名称的常量是否存在.如果该名称的常量已定义,返回 1;未定义则返回 0。
#elif后面要接常量表达式,所以#elif define是错误的,应该改为#elif defined.
睁大眼睛区分好“define”和“defined”。