#define            定义一个预处理宏
    #undef            取消宏的定义
    
    #if                   编译预处理中的条件命令,相当于C语法中的if语句
    #ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
    #ifndef            与#ifdef相反,判断某个宏是否未被定义
    #elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
    #else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
    #endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
    defined          与#if, #elif配合使用,判断某个宏是否被定义
    
    #ifdef ABC
    // ... codes while definded ABC
    #elif (CODE_VERSION > 2)
    // ... codes while CODE_VERSION > 2
    #else
    // ... remained cases
    #endif // #ifdef ABC
    
    #include<stdio.h>
    
    #define BB
    
    #ifdef AA
    
        #define HELLO "hello world"
    
    #elif BB
    
        #define HELLO "hello CC"
    
    #endif
    int main()
    {
    
        printf("%s\n",HELLO);
    
        return 1;
    
    }
    

    会出现:error: #if with no expression的错误。
    原因是BB虽然定义了,但是定义的是空值,放在#elif后面就不行。
    因为#elif不仅仅是检查后面的宏有没有定义,还会检查其值。
    但是#ifdef就只是检查后面的宏是否定义,而不管其值为多少。
    可以把#define BB改成#define AA试一下,结果就会打印hello world了。
    也可以把#define BB改成#define BB 0 试一试,#elif 0为假,HELLO没有定义。