我发现自己有一个“脸-手掌”型的问题,需要一些建议来解决。
我正在推出一个新的嵌入式C项目,该项目是围绕最初用动态C (DC)编写的逻辑引擎构建的。逻辑引擎完全写在一个文件中,没有头文件。我问题的症结在于,高级开发人员希望这个逻辑引擎在DC和新的C项目中编译,以便只需要维护逻辑的一个副本、定义等。DC的一个特性是包含文件非常复杂,原因很多,我不想在这里讨论。长话短说,提取变量、结构定义和将语句定义到.h文件会损害DC项目,因此不会编译。以下是两个感兴趣的文件的摘要:
动态C (DC)逻辑引擎'DClogicEngine.c‘
.#include 'newProject.h‘
~新项目所需的1000行结构和变量。
新C项目中需要的~ 1500 #define语句
~ 20k逻辑线
新项目(C代码) 'newProject.c‘
~一些代码。
~对'DClogicEngine.c‘中#define语句的大量相关引用
为了重新迭代我的问题,我完全能够使用#ifdefs和其他编译器选项来绑定到逻辑中,而且因为这是一个我可以控制的程序,所以我能够包含一个.h文件,允许我在DC文件中包含必要的逻辑。问题是从'newProject.c‘访问'DClogicEngine.c’中数以千计的#define语句。
我的问题是臭名昭著的,脸-手掌,和古老的问题,“我想包括一个.c文件在另一个。”我尝试过无数种方法将#include xx.c放置在不同的位置,然后用包含保护器变得聪明起来,但是没有运气(也没有惊喜)。我找到了一条古老的线索,我想我可以分享答案,因为它很幽默:

底线是将这些语句提取到一个.h文件中,这将给保持与DC构建的反向兼容性带来很大的痛苦。也许这将是一种必须承担的负担?
毫无疑问,我有一个愚蠢的问题。我的问题分三部分:
1.)有没有人遇到过这样的问题,你是如何解决的?
2.)我能做些什么创造性的事情来让这件事成功吗?有谁知道任何可能有用的编译器魔法吗?
2.)一般建议,解决这个问题最不痛苦的方法是什么?
发布于 2020-06-02 07:26:45
长话短说,提取变量、结构定义和将语句定义到.h文件会损害DC项目,因此不会编译。
这不可能。您是说您有一个DC源文件。不应该有系统的原因,为什么您不能提取源文件中包含结构定义和头文件中的其他声明的部分,这些声明可以被DC实现和C重新实现使用。(我不知道DC;可能与C不兼容,但是重构不应该影响DC侧-编译器仍然像以前一样只看到一个翻译单元)。它现在由一个包含头的源文件组成,这与编译器无关。)
你遇到的问题很可能不是一般性的问题。它们很可能是特定于项目和情况的(申报顺序等)。试着孤立他们,并在这里发布特定的问题。
发布于 2020-06-09 21:14:03
谢谢各位的回应,
最后,我唯一能做的事情就是从DClogicEngine.c提取必要的变量、结构和定义语句到一个新的DClogicEngine.h。我们对采取这一简单步骤犹豫不决,因为我们过去未能完成这项工作,并在这一进程中浪费了大量时间和精力。
我们首先提取一些东西--一个共同的“dummy.h”文件,这个文件是在项目之间共享的。在我们看到可以在原来的DC编译器和C编译器上消除错误之后,我们将所有内容都转移到了相互的.h文件中。最后,我们遇到了这样一个问题:我们也需要在头中包含函数原型,就像我们第一次做的那样(我们认为这是可以避免的,但最终还是必须这样做)。
为了安抚DC编译器,我们采取了不同的做法:在DC_BUILD文件中的函数原型周围放置#ifndef .h语句。简单有效!
如果将来有人有这个问题,这就是我们用来解决这个问题的步骤:
1.)DC编译器公开接受定义语句、变量和结构定义,如果您记得使用这里详细介绍的适当的startHeader和endHeader标记,在我们的例子中,这是完全没有痛苦的:https://catherineh.github.io/programming/2016/03/31/libraries-in-dynamic-c
2.)避免在.h文件中添加任何函数原型,DC编译器绝对不喜欢它们(除非您对DC有扎实的理解)!使用#ifdefs将.h文件中的所有函数原型隐藏在DC编译器中。
https://stackoverflow.com/questions/62144603
复制相似问题