【问题标题】:Including multiple .c files in a single translation unit在单个翻译单元中包含多个 .c 文件
【发布时间】:2021-05-25 17:40:27
【问题描述】:

在 C 中是否经常出现 .c 文件,包括其他内部 .c 文件以复制/粘贴方式具有静态变量/函数?就像一个由许多 .c 文件组成的 .c 文件一样,您希望所有内容都保持私有而不是在头文件中声明。

例子:

交流

static int a() {
    return 3;
}

b.c

static int b() {
    return 6;
}

c.h

int c();

c.c

#include "c.h"

#include "a.c"
#include "b.c"

int c() {
    return a() + b();
}

main.c

#include <stdio.h>

#include "c.h"

int main() {
    printf("%d\n", c())
}

编译

clang -c c.c
clang -c main.c
clang c.o main.o -o test.exe

【问题讨论】:

  • 包含源文件并不常见。如果您想做一些“私有”声明或结构定义等,这些声明或结构定义等在项目的一些但不是所有源文件之间共享,请为此创建第二个头文件。没有什么能阻止你拥有c.hc_private.h
  • 仅供参考,#include "anything.c" 是一种自动设计气味。当您声明“您希望将所有内容保密”时,这与您的设计完全矛盾。 a.c 和 b.c 的内容都被 #include 吸进了 c.c。 “私人”就这么多。没有什么能阻止其他人做确切同样的事情。
  • 如果你 #includeing 一个 .c 文件,你做错了。语言并没有阻止你这样做,但这不是通常的约定。而且,如果您想与他人合作开展更大的项目,则应该学习更传统的做事方式。
  • 然后做你已经做的事情:将单独的源文件作为单独的翻译单元构建到单独的目标文件中,然后将它们链接在一起。
  • 没有什么可以阻止您拥有多个翻译单元,这些翻译单元为在单个头文件中声明的函数提供定义。

标签: c header-files translation-unit


【解决方案1】:

如果你将 a.c 重命名为 a.h,b.c 重命名为 b.h,那么一切看起来都很正常。

#include 是编译器的预处理;它只是在那里插入目标文件的内容。不管是 .h 还是 .c 或其他什么。

但按照惯例,最好包含实现文件。这将破坏源代码结构。

【讨论】:

    【解决方案2】:

    不,这并不常见。标准方法是为 a.cb.c 创建新的头文件,并包含这些文件而不是 .c 源文件,否则就像你做的那样。然后,根据您的情况,分别编译所有源并将它们链接在一起:

    clang -c a.c
    clang -c b.c
    clang -c c.c
    clang -c main.c
    clang a.o b.o c.o main.o -o test.exe
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多