这个问题指的是“C ++中的模块”提案,并且更广泛地指C语言需要类似功能的语言(就像我目前玩弄的玩具语言......)。在我的世界中,“头文件”不存在,在编写任何类型的代码时,前向声明将是一种有害的维护,并且单个模块可以包含多个源文件。
问题如下:
源文件A使用源文件B中的函数或类,在当前正在编译的同一模块中。
为什么这是一个问题?
非常欢迎任何想法和当然的解决方案!
答案 0 :(得分:0)
忘记循环......(这是我最想考虑的部分):
自动确定必要的编译顺序并不意味着多次编译文件。
所需要的只是检测A依赖的文件B是否已经编译过,或者(b)是否正在编译,或者(c)尚未开始编译。我想(d)你可能根本没有计划编译B.
如果(a),很好,没问题。
如果是其他任何情况,必须暂停A的编译,直到B的编制完成为止。就这样。
我假设您有某种并行作业管理器或调度程序。如果(d),你告诉工作经理安排B的编译。如果(c),你告诉它使B的编译优先于现有的。如果(b),你只是在已经完成的B的编译中等待,和/或暂停A的编译,可能切换到做其他事情,直到B的编译完成。
如果你没有一个复杂的作业管理器,可能只是make -j 8,你可能会遇到死锁,因为所有8个并行作业可能都在等待一些依赖。在这种情况下,您可能必须停止其中一个,并且latyer完全重新启动它。
但是如果你有一个工作经理支持在工作休眠时输入任何数字,那么你不需要编译两次。 (禁止循环,需要放松。)
我很想建议您记住从一次编译到下一次重新编译的依赖图。这将是一个很好的启发式。而简单的不完全编译的东西,如扫描#includes可能有助于获得正确的顺序。但你可能会认为这违背了精神。
答案 1 :(得分:0)
我会以对文件A
有一定期望的方式编译文件B
。如果文件A
使用传递neatofunction
,int
和char*
的函数std::string
,则结果存储在short
中,然后它注意到在链接阶段期间必须有一个名为neatofunction
的函数,其中三个参数可从 int
转换,{{1} }和char*
,其返回类型是可转换为 a std::string
。
如果它使用类short
,那么它会注意到某处必须有一个名为vector<int>
的类,其中只有非默认模板参数是vector
所满足的类型,必须有一个默认构造函数(如果你默认构造它),析构函数,以及你使用的任何成员(赋值,int
,begin
等)。
这会将很多(C ++中的)编译器错误延迟到链接阶段(并使链接阶段变得更加棘手),但允许可移植编译。 (并导出模板!)我想这就是很多说起来容易做起来不过。