• #if、#ifdef、#else等用法


    一、(#if使用)

    #if(条件满足)
    	执行代码1
    #else
    	执行代码2
    #endif
    

    实例

    #define  A 0  //把A定义为0
    #if (A > 1)
             printf("A > 1");  //编译器没有编译该语句,该语句不生成汇编代码
    #elif (A == 1)
             printf("A == 1"); //编译器没有编译该语句,该语句不生成汇编代码
    #else
             printf("A < 1");   //编译器编译了这段代码,且生成了汇编代码,执行该语句
    #endif
    

    二、(#if define使用)

    #if defined (x)
        ...code...
    #endif
    
    
    #if defined(CREDIT)  
        credit();  
    #elif defined(DEBIT)  
        debit();  
    #else  
        printerror();  
    #endif  
    

    #if defined(x):它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,
    如果定义了x个宏,那么,编译器会编译中间的…code…,否则忽视中间的…code…代码。

    #if defined(x)也可以取反,也就用 #if !defined(x)

    三、(#ifdef 使用)

    ***#ifdef的使用和#if defined()的用法一致 ***
    #ifndef又和#if !defined()的用法一致

    #ifdef 标识符
        程序段1
    #else
        程序段2
    #endif
    

    四、拓展

    include<stdio.h>
    #define BB
    
    #ifdef AA
    #define HELLO "hello world"
    #elif BB
    #define HELLO "hello CC"
    #endif
    int main()
    {
    	printf("%s
    ",HELLO);
    	return 1;
    }
    

    如果你觉得这个打印会是hello CC.那你就和我犯了一样的错误了。

    1、如果你用gcc -E hello.c -o hello.i 编译,(预编译命令)会出现:error: #if with no expression的错误。

    原因是BB虽然定义了,但是定义的是空值,放在#elif后面就不行。因为#elif不仅仅是检查后面的宏有没有定义,还会检查其值。

    2、#ifdef就只检查后面的宏是否定义,而不管其值为多少。读者可以把#defineBB改成#define AA试一下,结果就会打印hello world了。

    3、再次把#define BB改成#define BB 0 试一试,这时用gcc -E hello.c -o hello.i预编译可以编译通过,但是编译过程gcc hello.c -o hello,因为#elif 0为假,HELLO没有定义。

    四、拓展二

    if 后未定义的字符被替换成0

    (1)#if 后未定义的字符被替换成0
     代码:
    #include <stdio.h>
    int  main(int argc, char *argv[])
    {
     printf("hello!
    ");
    #if  I_LOV_U
     printf("world!
    "); 
    #endif
     return 0;
    }
    执行结果为:
     yuanlulu@ubuntu:~$ ./a.out
    hello!
    结果并不出人意料,但是为啥预处理器没报错呢, 未定义的字符“I_LOV_U”是怎么处理的呢, 《C程序设计语言》中的原话是:
    预处理器进行宏扩展之后,对于没有定义的任何标识符都将用0来代替,所以“#if I_LOV_U” 等价于“#if  0”
    
    
    (2)未定义的宏也能打开条件编译
     修改代码如下:
    #include <stdio.h>
    int  main(int argc, char *argv[])
    {
     printf("hello!
    ");
    #if  (VERSION == NEED_VERSIION)
     printf("world!
    "); 
    #endif
     return 0;
    }
    得出的结果如下:
        yuanlulu@ubuntu:~$ ./a.out 
        hello!
        world!
    

    明明那两个宏没有定义,怎么就打开了那段代码了呢? 由上面的知识可知,预处理器进行宏扩展之后,对于没有定义的任何标识符都将用0来代替,
    所以“#if (VERSION == NEED_VERSIION)”最后被扩展为 “#if (0 == 0)”,这个条件显然是成立的。

    参考文章:
    https://blog.csdn.net/freewaywalker/article/details/50035923?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242

  • 相关阅读:
    【linux就该这么学】-05
    【linux就该这么学】-04
    【linux就该这么学】-03
    【linux就该这么学】-02
    【linux就该这么学】-01
    【linux就该这么学】-00
    MySQL57安装与设置
    Docker(一) Docker入门教程
    Centos 7.X 安装及常规设置
    删除数组里所有与给定值相同的值
  • 原文地址:https://www.cnblogs.com/retry/p/14045291.html
Copyright © 2020-2023  润新知