zoukankan      html  css  js  c++  java
  • 条件编译#ifdef MACRO_A和#if defined(MACRO_A)的区别

    在查阅linux内核源码的过程中,发现存在两种不同类型的条件编译语句:#ifdef MACRO_A和#if defined(MACRO_A)或#if !defined(MACRO_A)

    #ifdef和#ifdefined()之间的区别

    实际上,两者并无本质的差别,但后者的应用范围更广,能支持多个预编译变量的检查。

    #if defined(MACRO_A) && !defined(MACRO_B)
    #endif
    
    如果用前者的方式来表达,只能使用嵌套的条件判断

    #ifdef(MACRO_A)
        #ifndef(MACRO_B)
            ...;
            ...;
        #endif
    #endif


    后来,在源码中又看到了这样的条件语句:

    #define CONFIG_RMII            0

    在c文件中,这样使用宏定义:

    #ifdef CONFIG_RMII
        macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
    #else
        macb_writel(macb, USRIO, 0);
    #endif

    我的编译结果是,不管将CONFIG_RMII设为0或1,编译出来的二进制文件,除了编译时间不同,其他都一样。

    这说明对该宏的使用有误。

    从网上查了些资料,发现是对#if和#ifdef的区别不清楚所导致。

    #if和#ifdef之间的区别

    对于#if后面需要是一个表达式,如果表达式为1则调用#if下面的代码。
    对于#ifdef后面需要的只是这个值有没有用#define定义,并不关心define的这个值是0还是1。


    要使得判别条件#ifdef结果为假,也就是不执行判别条件后面所跟的语句,需要对#ifdef后面所跟的宏使用#undef语句进行声明。



  • 相关阅读:
    《构建之法》阅读有疑 与 个人Week1作业
    版本管理和项目管理软件浅谈
    [2019BUAA软工助教]第0次个人作业
    [2017BUAA软工助教]博客格式的详细说明
    [2017BUAA软工助教]收集个人信息
    最长英文单词串题目分析
    蓝桥杯PREV-11:横向打印二叉树
    day2
    冯如杯day1
    个人阅读作业
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218569.html
Copyright © 2011-2022 走看看