#dedef使用#ifndef后,#define未按预期工作

时间:2015-04-05 19:06:40

标签: c c-preprocessor

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

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

3 个答案:

答案 0 :(得分:3)

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

一旦它到达#undef#ifndef就会被遗忘,并且不会再被评估。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

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

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

应为:#ifdef ADD

#undef ADD

也是如此