编译模块的部分(没有标题)

时间:2012-02-19 16:39:20

标签: c++ language-agnostic module

这个问题指的是“C ++中的模块”提案,并且更广泛地指C语言需要类似功能的语言(就像我目前玩弄的玩具语言......)。在我的世界中,“头文件”不存在,在编写任何类型的代码时,前向声明将是一种有害的维护,并且单个模块可以包含多个源文件。

问题如下:

  

源文件A使用源文件B中的函数或类,在当前正在编译的同一模块中。

为什么这是一个问题?

  • 文件B中包含的内容没有模块文件,将在编译所有源文件时生成。
  • 我不想两次编译文件B,也不想强制同时编译模块中的所有文件。这是为了使最终的构建简单易行。
  • 我不希望强制用户先编译文件B.我不是说应该允许循环依赖,我只是希望能够并行编译这两个文件。哎呀,自动确定必要的编译顺序意味着不止一次编译文件,这是我不惜一切代价避免的。

非常欢迎任何想法和当然的解决方案!

2 个答案:

答案 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使用传递neatofunctionintchar*的函数std::string,则结果存储在short中,然后它注意到在链接阶段期间必须有一个名为neatofunction的函数,其中三个参数可从 int转换,{{1} }和char*,其返回类型是可转换为 a std::string

如果它使用类short,那么它会注意到某处必须有一个名为vector<int>的类,其中只有非默认模板参数是vector所满足的类型,必须有一个默认构造函数(如果你默认构造它),析构函数,以及你使用的任何成员(赋值,intbegin等)。

这会将很多(C ++中的)编译器错误延迟到链接阶段(并使链接阶段变得更加棘手),但允许可移植编译。 (并导出模板!)我想这就是很多说起来容易做起来不过。