如何在C中处理多级包含?

时间:2013-05-11 02:13:49

标签: c gcc include c-preprocessor multi-level

我有二级包括让我感到悲伤:

Undefined                       first referenced
 symbol                             in file
function2                      /var/tmp//ccAPaWbT.o
ld: fatal: symbol referencing errors. No output written to run
collect2: ld returned 1 exit status

主档案:

#include "functions02.c"
int main(){
int x = funcion2();
}

functions02.c文件:

#ifndef FUNCTIONS02_C
#define FUNCTIONS02_C
int funcion2();
#if __INCLUDE_LEVEL__ == 0
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include "functions01.c"
int main() {
   return function2();
}
#endif
int function2()
   return function1();
}
#endif

functions01.c文件:

#ifndef FUNCTIONS01_C
#define FUNCTIONS01_C
int funcion1();
#if __INCLUDE_LEVEL__ == 0
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
   return function1();
}
#endif
int function1()
   return 10;
}
#endif

我假设可以使用__INCLUDE_LEVEL__或在gcc编译时操纵链接来修复此操作,但我无法找到分叉变体。

首先,如果不将函数放在外部头文件中,可以实现我想要的功能吗? 那么这样做的正确方法是什么?

编辑: 我意识到我忘了为它们添加函数依赖项。也就是说,函数使用的包含不能通过在主要函数旁边添加它们来排除,如果关闭则在排除中扭曲。

1 个答案:

答案 0 :(得分:0)

是的,可以使用编译时标志(以及使用#if的代码)包含/排除代码的任何部分。正如您尝试的那样。

在你的情况下,我假设你没有定义__INCLUDE_LEVEL__标志,因此链接器无法找到funciton2,所以错误。

如果你定义它,你将有三个“main()”:-),它将再次失败。所以,你需要稍微修改你的代码。

另外,#include'“C”文件是不可取的,在实践中不使用。我假设你只是想试验&amp;学习,这很好。