需求:假如现在要开发一个C语言程序,让它输出红色的文字,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢?
这个程序的难点在于,不同平台下控制文字颜色的代码不一样,我们必须要能够识别出不同的平台。
Windows 有专有的宏_WIN32
,Linux 有专有的宏__linux__
,很容易就想到了 if else,请看下面的代码:
#include <stdio.h>
int main(){
if(_WIN32){
system("color 0c");
printf("windows系统\n");
}else if(__linux__){
printf("linux系统\n");
}else{
printf("两个都没选。。。\n");
}
return 0;
}
但这段代码是错误的,在 Windows 下直接红色波浪线提示 __linux__ 是未定义的标识符,在 Linux 则提示_WIN32是未定义,这时候改进一下代码:
#include <stdio.h>
int main(){
#if _WIN32
system("color 0c");
printf("Windows系统\n");
#elif __linux__
printf("linux系统\n");
#else
printf("两个都没选。。。\n");
#endif
return 0;
}
上面代码中的:#if、#elif、#else 和 #endif 都是预处理命令,整段代码的意思是:如果宏 _WIN32 的值为真,就保留它代码域内的代码,删除其他代码(不包括#endif);如果宏 __linux__ 的值为真,就保留它代码域内的代码,删除其他代码(当然也不包括#endif);如果所有的宏都为假,#else 代码域中的代码
这些操作都是在预处理阶段完成的,多余的代码以及所有的宏都不会参与编译,不仅保证了代码的正确性,还减小了编译后文件的体积。
这种能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。条件编译是预处理程序的功能,不是编译器的功能。
需要注意的是,#if 命令要求判断条件为“整型常量表达式”,也就是说,表达式中不能包含变量,而且结果必须是整数;然而 if 后面的表达式没有限制,只要符合语法就行。这是他们之间的区别。
#ifdef命令和#ifndef
#ifdef命令的使用格式:
#ifdef 宏名
代码域1
#else
代码域2
#endif
它的意思是:如果该宏已经被定义了,编译代码域1,否则编译代码域2. 而#ifndef的用法与#ifdef的用法一致,只是意思相反而已。