• C语言条件编译(#if,#ifdef,#ifndef,#endif,#else,#elif)!


    条件编译(conditional compiling)命令指定预处理器依据特定的条件来判断保留或删除某段源代码。

    例如,可以使用条件编译让源代码适用于不同的目标系统,而不需要管理该源代码的各种不同版本。

    条件编译区域以 #if、#ifdef 或 #ifndef 等命令作为开头,以 #endif 命令结尾。条件编译区域可以有任意数量的 #elif 命令,但最多一个 #else 命令。以 #if 开头的条件编译区域具有下面的格式:

    #if 表达式1
    
      [ 组1]
    
    [#elif 表达式2
    
      [ 组2]]
    
    ...
    
    [#elif 表达式n
    
      [ 组n ]]
    
    [#else
    
      [ 组n+1 ]]
    
    #endif

    预处理器会依次计算条件表达式,直到发现结果非 0(也就是 true)的条件表达式。

    预处理器会保留对应组内的源代码,以供后续处理。如果找不到值为 true 的表达式,并且该条件式编译区域中包含 #else 命令,则保留 #else 命令组内的代码。

    组 1、组 2 等代码段,可以包含任意 C 源代码,也可以包含更多的命令,包括嵌套的条件式编译命令。在预处理阶段结束时,没有被预处理器保留以用于后续处理的组会从程序中全部删除。

    #if 和 #elif 命令

    作为 #if 或 #elif 命令条件的表达式,必须是整数常量预处理器表达式。这与普通的整数常量表达式不同,主要区别在于:

            (1) 不能在 #if 或 #elif 表达式中使用类型转换运算符。

            (2) 可以使用预处理运算符 defined。

            (3) 在预处理器展开所有宏,并且计算完所有 defined 表达式之后,会使用字符 o 替换掉表达式中所有其他标识符或关键字。

            (4) 表达式中所有带符号值都具有 intmax_t 类型,并且所有无符号值都具有 uintmax_t 类型。字符常量也会受该规则的影响。intmax_t 和 uintmax_t 定义在头文件 stdint.h 中。

            (5) 预处理器会把字符常量和字符串字面量中的字符与转义序列转换成运行字符集中对应的字符。然而,字符常量在预处理器表达式和在后期编译阶段是否具有相同的值,取决于实现版本。

    defined 运算符

    一元运算符 defined 可以出现在 #if 或 #elif 命令的条件中。它的形式如下:

    defined 标识符

    defined (标识符)

    如果指定的  identifier 是一个宏名称(也就是说,它已被 #define 命令定义,并且未被 #undef 命令取消定义),则 defined 表达式会生成值 1。否则,defined 表达式会生成值 0。

    defined 运算符相对于 #ifdef 和 #ifndef 命令的优点是:你可以在更大型的预处理器表达式中使用它的值。如下例所示:

    #if defined( __unix__ ) && defined( __GNUC__ )

    /* ... */

    #endif

    大多数编译器会提供预定义宏,例如上例所使用的宏,它用来识别目标系统和编译器。

    因此,在 Unix 系统中,通常预先定义好了宏 __unix__,而 GCC 编译器则会预先定义好了宏 __GNUC__。类似地,微软 Windows 平台上的 Visual C 编译器会自动定义好宏 _WIN32 和宏 _MSC_VER。

    #ifdef 和 #ifndef 命令

    你可以通过 #ifdef 和 #ifndef 命令测试某个宏是否已被定义。它们的语法是:

    #ifdef标识符

    #ifndef标识符

    这等同于下面的 #if 命令:

    #if defined 标识符

    #if !defined 标识符

    如果 identifier 不是宏名称,则 #ifndef 标识符后面的条件代码被保留。

    不管你是转行也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~

    【值得关注】我的 编程学习交流俱乐部 !【点击进入】

    C语言入门资料:


     

    C语言必读书籍:


     
  • 相关阅读:
    模拟hadoop-rpc通信
    IOUtils方式上传下载文件
    HDFS基本操作的API
    HDFS基本命令行操作及上传文件的简单API
    gcj_2016_Round1_B
    hiho_1070_RMQ
    hiho_1068_RMQ_st算法
    hiho_1067_最近公共祖先2
    hiho_1062_最近公共祖先
    hiho_1066_并查集
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14680932.html
Copyright © 2020-2023  润新知