Answers:
如果使用得当,这可能是有用的技术。
假设您有一个复杂的,性能关键的子系统,该子系统具有相当小的公共接口和许多不可重用的实现代码。该代码运行到几千行,一百个左右的私有函数以及相当多的私有数据。如果使用非平凡的嵌入式系统,则可能会足够频繁地处理这种情况。
您的解决方案可能是分层,模块化和分离的,并且可以通过在不同文件中编码子系统的不同部分来有效地表示和增强这些方面。
使用C,这样做会损失很多。几乎所有工具链都为单个编译单元提供了不错的优化,但是对于任何声明为extern的东西都非常悲观。
如果将所有内容都放入一个C源模块中,则会得到-
性能和代码大小的改进-在许多情况下都将内联函数调用。即使没有内联,编译器也有机会产生更有效的代码。
链接级数据和功能隐藏。
避免名称空间污染及其必然结果-您可以使用较少笨拙的名称。
更快的编译和链接。
但是,在编辑此文件时,您也会感到一团糟,并且失去了隐含的模块化。可以通过将源分成几个文件并包括这些文件以生成一个编译单元来克服。
但是,您需要强加一些约定来适当地管理它。这些在某种程度上取决于您的工具链,但是一些通用的指针是-
将公共接口放在单独的头文件中-无论如何,您都应该这样做。
有一个主.c文件,其中包括所有辅助.c文件。这也可能包括公共接口的代码。
使用编译器防护措施来确保外部编译单元不包含专用头文件和源模块。
所有私有数据和功能都应声明为静态。
保持.c和.h文件的概念区别。这利用了现有的约定。不同之处在于,标题中会包含很多静态声明。
如果您的工具链没有强加任何理由,请将私有实现文件命名为.c和.h。如果使用include防护,则这些防护将不会产生代码,也不会引入任何新名称(在链接过程中,您可能会得到一些空段)。巨大的优势是其他工具(例如IDE)将适当地处理这些文件。
可以吗 是的,它将编译
推荐吗?no-.c文件编译为.obj文件,这些文件在编译后(由链接器链接在一起)到可执行文件(或库)中,因此无需在一个文件中包含一个.c文件。相反,您可能要做的是制作一个.h文件,该文件列出另一个.c文件中可用的函数/变量,并包括.h文件
C语言没有禁止使用此类#include,但是生成的翻译单元仍然必须是有效的C。
我不知道您使用的是哪个程序与.prj文件。如果您使用的是“ make”或Visual Studio之类的工具,则只需确保将其文件列表设置为要编译的文件即可,而不能单独编译。