C 内核库包含和膨胀

标签 c coding-style linker include include-guards

我是新人,所以我提前感谢您的帮助和耐心。我用 C 语言编写了一个程序,如下所示:

main.c
arpsend.h - header w/include guard for arpsend.c functions
arpsend.c - includes <net/if.h>, <pthread.h>, etc.
arprec.h  - header w/include guard for arprec.c functions
arprec.c  - includes <net/if.h>, <pthread.h>, etc.

arpsend 和arprec 文件使用许多相同的内核库函数和定义。我注意到,当我编写 arprec.c 代码时,我的程序大小猛增。它比我的代码应该有的要膨胀得多。这使我得出结论,arpsend.c 和arprec.c 都在各自的.c 文件中链接了满足其自身需求所需的linux 库代码。该链接对于项目来说是多余的,但对于每个 .c 文件来说都是必需的。

我的问题如下:

  1. 如果我添加到项目中的每个 .c 文件都会因为内核和标准库冗余而像这样膨胀,那么每个程序是否都会变得不必要的膨胀?我的示例中的膨胀可能微不足道(~12k),但我只能想象如果我需要在几个不同的 .c 文件中使用某些图形库,会发生什么样的膨胀。

  2. 有办法避免这种情况吗?

  3. 推荐的解决方案是否只是将使用相同内核代码的所有函数保留在一个文件中?

  4. 如果#3 是正确的,那么这是否就违背了保持代码整洁的目的?它是 C 语言,所以它不是真正的 OOP,但我想将我的代码展开,以便我可以轻松地看到项目的组成。

如果这是多余的,我深表歉意。我在这里的论坛上进行了几个小时的筛选。我找不到我的确切问题。再次感谢您的帮助

最佳答案

当您将 arprec.c 文件添加到项目中时,您认为二进制大小应该增加多少,而不是实际增加了多少?

无论项目中有多少文件使用库函数,库函数仅链接到最终可执行文件一次。链接器通常很智能,只包含最终可执行文件中代码实际使用的库函数; arprec.c 是否有可能使用 arpsend.c 不使用的库调用?

关于C 内核库包含和膨胀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17904429/

相关文章:

c - 如何编写C程序

c - sleep 必须在 tcdrain() 之后吗?

c++ - 应用程序错误 - 调试 exe 无法运行

haskell - GHC静态链接动态库

python - 从 Python 转换为 C 列表函数

coding-style - "Lisp Style"花括号语言的缩进

Java:重复、过度使用——问题?

c# - 处理常见错误 : If-Then-Throw blocks vs. 代码契约与断言类

c++ - 从构建库切换到 exe 或 dll 时出现 Unresolved external symbol 错误

c - 隐式动态链接与显式动态链接 - 哪个更有效?