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