#define 在#undef 使用#ifndef 后没有按预期工作

#define not working as expected after #undef using #ifndef

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

#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);
}

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

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

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

#ifndef ADD(X,Y)没有意义。

它应该是:#ifdef ADD

#undef ADD

也一样

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

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

注意相同点和不同点。

#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;
}