在C语言中,预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
条件编译指令将决定哪些代码被编译,哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。
下面是部分预处理指令:
指令用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息
1.#if指令
#if 指令检测跟在后面的常量表达式,如果表达式为真,则编译后面的代码,直到出现#else、#elif或#endif为止;否则就不编译。
2.#endif指令
#endif用于终止#if预处理指令。
#include<stdio.h> #define DEBUG 0 int main() { #if DEBUG printf("Debugging\n"); #endif printf("Running\n"); return 0; }
由于程序定义DEBUG宏代表0,所以#if条件为假,不编译后面的代码直到#endif,所以程序直接输出Running。
如果去掉#define语句,效果是一样的。
3.#ifdef和#ifndef
#include<stdio.h> #define DEBUG int main() { #ifdef DEBUG printf("YES\n"); #endif #ifndef DEBUG printf("NO\n"); #ednif return 0; }
#ifdefined等价于#ifdef;#if!defined等价于#ifndef
4.#else指令
#else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码。#endif指令将终止上面的条件块。
#include<stdio.h> #define DEBUG int main() { #ifdef DEBUG printf("Debugging\n"); #else printf("Notdebugging\n"); #endif printf("Running\n"); return 0; }
5.#elif指令
#elif预处理指令综合了#else和#if指令的作用。
#include<stdio.h> #define TWO int main() { #ifdef ONE printf("1\n"); #elif defined TWO printf("2\n"); #else printf("3\n"); #endif return 0; }
程序很好理解,最后输出结果是2。