C语言基础——条件编译

需求:假如现在要开发一个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的用法一致,只是意思相反而已。

猜你喜欢

转载自blog.csdn.net/u013812502/article/details/81180786