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

时间:2017-02-26 17:12:27

标签: c macros exit status factorial

我写了这段代码:

/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>
  

为什么会显示此错误以及如何解决?

2 个答案:

答案 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的早期,预处理器和编译器曾经是独立的程序。它们捆绑在今天的操作系统中。