我想知道我们是否可以在C/C++中使用递归宏?如果是,请提供示例.

第二件事:为什么我不能执行下面的代码?我到底在做什么错误的事?是因为递归宏吗?

# define pr(n) ((n==1)? 1 : pr(n-1))
void main ()
{
    int a=5;
    cout<<"result: "<< pr(5) <<endl;
    getch();
}

推荐答案

您的编译器可能会提供一个选项,只进行预处理,而不进行实际编译.如果您试图查找宏中的问题,这将非常有用.例如,使用g++ -E:

> g++ -E recursiveMacro.c

# 1 "recursiveMacro.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "recursiveMacro.c"

void main ()
{
    int a=5;
    cout<<"result: "<< ((5==1)? 1 : pr(5 -1)) <<endl;
    getch();
}

如您所见,它不是递归的.pr(x)在预处理期间仅替换一次.需要记住的重要一点是,预处理器所做的一切只是盲目地用一个文本字符串替换另一个文本字符串,它实际上并不计算像(x == 1)这样的表达式.

您的代码不会编译的原因是pr(5 -1)没有被预处理器替换,因此它最终在源代码中作为对未定义函数的调用而结束.

C++相关问答推荐

Apple Libm的罪恶功能

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

strftime函数中%s的历史意义是什么?为什么没有记录?

为什么在C中二维字符数组会有这样的行为?

GCC预处理宏和#杂注GCC展开

如果我释放其他内容,返回值就会出错

在编译时参数化类型定义

为什么STM32G474RE上没有启用RCC PLL

用C宏替换strncMP函数中的参数

解决S随机内存分配问题,实现跨进程高效数据共享

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

我在C程序的Flex/Bison中遇到语法错误

C程序向服务器发送TCPRST

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

如何使用空元素块声明指针数组

未为同一文件中的函数执行DirectFunctionCall

关于不同C编译器中的__attribute__支持

指向返回 struct 成员的指针,安全吗?

malloc:损坏的顶部大小无法找出问题

比 * 更快的乘法