【问题标题】:#define not working as expected after #undef using #ifndef#define 在#undef 使用#ifndef 后无法按预期工作
【发布时间】:2015-04-05 19:06:39
【问题描述】:

我写了一个简单的程序来改变乘法的加法

#include<stdio.h>

#define ADD(X,Y) X+Y

void fun()
{
    #ifndef ADD(X,Y)
        printf("entered #ifndef");
        #define ADD(X,Y) X*Y;
    #endif

    int y=ADD(3,2);
    printf("%d",y);
}

int main()
{
    #undef ADD(X,Y)
    fun();

    return 0;
}

我期望的输出是 3*2 但代码仍然输出 3+2 即 5 .
代码不输出:"entered #ifndef",这意味着#undef 不工作? 这里有什么问题?

编辑: 感谢@deviantfan

这是正确的代码:

#include<stdio.h>

#define ADD(X,Y) X+Y

void fun();

int main()
{
    #undef ADD(X,Y)
    fun();

    return 0;
}

void fun()
{
    #ifndef ADD(X,Y)
        printf("entered #ifndef");
        #define ADD(X,Y) X*Y;
    #endif

    int y=ADD(3,2);
    printf("%d",y);
}

【问题讨论】:

  • 警告:#ifndef 指令 [-Wextra-tokens] 末尾的额外标记
  • #undef 在这里什么都不做。预处理器指令在代码中进行处理,无论它们是否在函数内部(在您的情况下为fun())。

标签: c c-preprocessor


【解决方案1】:

预处理器(处理例如#define)不知道
功能或类似的东西。它严格从上到下处理文件,
独立于实际代码执行将如何在运行时跳转。

一旦它到达您的#undef#ifndef 就会被长期遗忘,不会再次被评估。

【讨论】:

    【解决方案2】:

    这个问题的实际解决方案是使用函数指针。

    这是从当前代码到函数指针的直接转换。

    注意相同点和不同点。

    #include <stdio.h>
    
    int actual_add(int X, int Y) {
       return X+Y;
    }
    
    int actual_multiply(int X, int Y) {
       return X*Y;
    }
    
    int (*ADD)(int,int) = actual_add;
    
    void fun()
    {
        if (!ADD)
        {
            printf("entered #ifndef");
            ADD = actual_multiply;
        }
    
        int y=ADD(3,2);
        printf("%d",y);
    }
    
    int main()
    {
        ADD = NULL;
        fun();
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      #ifdef#ifndef#undef 预处理器指令需要标识符,而不是表达式。

      #ifndef ADD(X,Y) 毫无意义。

      应该是:#ifdef ADD

      #undef ADD 也是如此

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-21
        • 2020-04-16
        • 1970-01-01
        • 2013-12-23
        • 2014-12-09
        • 2016-01-13
        • 2020-09-21
        • 2011-08-17
        相关资源
        最近更新 更多