【问题标题】:How to handle multilevel includes in C?如何处理 C 中的多级包含?
【发布时间】:2013-05-11 02:13:48
【问题描述】:

我有第二级包含,这让我很伤心:

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 编译时操作链接进行修复,但我找不到分叉变体。

首先是否可以在不将函数放入外部头文件的情况下实现我正在寻找的东西? 其次,正确的做法是什么?

编辑: 我意识到我忘记向它们添加函数依赖项。也就是说,如果关闭,函数使用的包含不能通过将它们添加到主函数旁边而被排除在排除中。

【问题讨论】:

  • 哎哟。你想在这里达到什么目的?我无法想象在很多情况下我想在我的 C 文件中进行条件编译(而不是在头文件中)。
  • 包含.c 文件是非常不习惯的。 +1 给@Gian - 你想在这里做什么?
  • 这是一个链接器错误,不能编译,对吧?这与包含无关。
  • 我在一个特定系统上有一个非常严格的文件命名条件,我不能有头文件,甚至不能将 c 文件分成两个不同的文件,一个文件保存函数,而另一个文件只是执行调用。谢谢你的警告,如果我有选择的话,我永远不会做那样的事情

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


【解决方案1】:

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

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

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

此外,#include'ing 一个“C”文件是不可取的,并且在实践中不使用。我假设您只是想尝试和学习,这很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多