#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;
}
我写了一个简单的程序来改变乘法的加法
#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;
}