为什么在我的代码中使用宏会导致错误,我该如何解决?

Why is using a macro in my code causing an error and how can I fix it?

我写了这段代码:

#include <stdio.h>

#define fctrl(N) ( (N==1)? (N) : (N*fctrl(N-1)) )

int main()
{
    int m,n=7;
    m = fctrl(n);
    printf("fctrl is %d\n",m);
    return 0;
}

编译时出现如下错误:

/tmp/ccRODXnZ.o: In function `main':
/home//Desktop/fctrl/fctrl.c:8: undefined reference to `fctrl'
collect2: error: ld returned 1 exit status

为什么会显示此错误,我该如何解决?

您试图定义一个模拟递归函数的宏,但宏不支持递归,因此出现错误。

我会改用函数,但您总是在 C preprocessor, recursive macros 中阅读更多内容。

"actual" C 编译器不处理宏。宏由 c-preprocessor 处理,它只是一种文本替换机制,因此您定义为宏并打算作为函数工作的类似函数的表达式不会产生正常的函数行为。

进行预处理后,您的程序将采用以下结构,

#include <stdio.h>

int main()
{
    int m,n=7;
    m = ( (n==1)? (n) : (n*fctrl(n-1)) );
    printf("fctrl is %d\n",m);
    return 0;
}

你应该问自己的问题是fctrl函数在哪里定义的?答案很明显,未定义,这就是您收到 undefined reference to 'fctrl' 错误的主要原因。

在终端上使用 cpp -nostdinc {filename}gcc -E -nostdinc {filename} 命令,您将了解发生了什么。顺便说一句,-nostdinc 用于禁止包含系统头文件。 cpp 是调用 C/C++ 预处理器的程序,尽管 C/C++ 预处理器的用途不仅仅是 C/C++ 文本替换机制。 gcc -E 选项给出与 cpp 命令相同的结果。在 Unix 的早期,预处理器和编译器曾经是独立的程序。它们在当今的操作系统中捆绑在一起。