我正在实现一个C项目,要在一个更大的C项目中编译。我有一个很大的.c
文件(没有头文件),我最近在其中添加了一些内容。这些内容的目的在逻辑上与大的C文件是分开的。我想将其拆分为两个.c
文件,以便更好地维护。然而,我面临着一个复杂的问题。
虽然在逻辑上是可以分离的,但这些理论上分离的单元(.c
文件)必须共享一些静态函数和原始文件中的声明。当试图创建一个头文件来包含公共依赖项(这是公共过程)时,我遇到了困难,因为以下原因(以及我所尝试的)。
- 我的代码被埋在一个更大的项目中,它有一些和我的代码相同的定义,这就是为什么它们最初是静态声明的原因。它是这样工作的,但是当我试图拆分c文件并创建头文件时,我不得不删除其中一些文件中的static关键字(为了不获取错误undefined引用),但这导致了多个声明错误,因为与更大的项目冲突(预期但令人沮丧)。
- 我不能更改这些函数和结构的命名,因为它们对于与外部项目一起工作是严格的。
- 如果头文件中的声明是静态的,而c文件中的定义不是静态的,我对会发生什么感到困惑。无法确定这是否会导致冲突(理论上应该是这样?)
- 我不想在分离的文件中重复静态的公共依赖关系,这只涉及到制作代码的副本,与我简化维护的目的相矛盾。
我想它归结到是,我可以创建这样一个头文件或文件,链接(导出符号)只对导入该头文件的c文件可见,而不是从其他翻译单元.这是要求这些单元,我创建可以看到对方的定义(因为头文件只包括他们).
即使当我问它的时候,它似乎是不可能的,但是我可能是从一个错误的观点来处理这个问题的,我也想知道。我正在尝试做的是不可能的,我应该把它作为一个单一的文件吗?
如果有用的话,我正在为Nginx Web服务器开发一个模块。
1条答案
按热度按时间hfyxw5xn1#
在极少数情况下,包含.c文件是有意义的。
首先,您有两个.c文件,例如module1.c和module2.c。然后创建名为mylibrary.c的第三个文件,其中仅包含以下内容:
并编译 just mylibrary.c。虽然这意味着您无法通过单独编译模块来减少编译时间,但您仍然可以在不同的.c文件中逻辑分离函数,同时只导出所需的函数。
对于需要在子模块之间共享的静态函数,请为这些函数创建单独的标头以包含在每个子模块中。
例如:
模块1_权限. h:
模块2_权限. h:
模块1.c:
模块2.c: