我写了这段代码:
/tmp/ccRODXnZ.o: In function `main':
/home//Desktop/fctrl/fctrl.c:8: undefined reference to `fctrl'
collect2: error: ld returned 1 exit status
编译时,我收到以下错误:
<html>
<body>
<table>
<tr>
<th>
Left Column
</th>
<th>
Right Column
</th>
</tr>
<tr>
<td>
<img src="https://dummyimage.com/240x80/000/fff">
</td>
<td>
<input type="checkbox" style="display:block; margin:0 auto;">
</td>
</tr>
</table>
</body>
</html>
为什么会显示此错误以及如何解决?
答案 0 :(得分:2)
您正在尝试定义一个模拟递归函数的宏,但宏不支持递归,因此错误。
我会改用函数,但你总是在C preprocessor, recursive macros中阅读更多内容。
答案 1 :(得分:1)
&#34;实际&#34>处理宏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的早期,预处理器和编译器曾经是独立的程序。它们捆绑在今天的操作系统中。