1

(作为前言,我意识到这很古怪,不是标准的 C++ 实践,但它适合我的目的。)

好的,所以我有一个 C++ 库,它基本上都是头文件,因为它大量使用模板。几乎每个头文件都包含一个类定义(“ButterworthFilter.h”、“Interpolator.h”等)。我想让这些类中的每一个都有第二个“独立”版本,以便它们可以轻松地传输到不同的项目而无需占用整个库。所以基本上这个手动版本将进入每个标题,查看#include依赖项,然后将这些包含的类复制/粘贴到它们在原始文件中#included的顶部。这样做的问题是,只要原始文件之一发生更改,就需要更改,因此无论何时进行更新都应该以编程方式完成。

有没有办法让编译器输出每个依赖文件的全部内容或其他东西?例如,我可以告诉编译器输出 ButterworthFilter.h 的依赖项,它会检查 #includes,查看它是否依赖于 Filter.h,并输出所有 Filter.h(以及递归的任何依赖项)。更好的是实际上是用来操作这样的库的程序。我认为拥有一个可以生成隐藏在某个库中的任何有用类的独立版本的工具会很棒。

无论如何,我希望这个问题有意义,并提前感谢。

4

2 回答 2

2

您可以使用编译器编写预处理的结果。通常,您使用该-E选项来获得预处理文件的结果。经过处理的文件往往具有原始文件的行号和指示 - 您可能希望删除这些。当然,这也会扩展宏,但除了包含保护之外,您希望无论如何都不使用任何宏......

于 2012-11-02T21:33:22.363 回答
0

你看着正确的方向: http: //gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

有 -M 选项可以生成适合 make 的规则 - 因此它列出了所有依赖文件 - 那是所有头文件,因此 make 可以知道如果头文件更改,则必须重新编译目标文件。与 -MF 选项一起使用。

来自 gcc 文档:

-M
不是输出预处理的结果,而是输出适合的规则
用于描述主源文件的依赖关系。
预处理器输出一个包含目标文件名的 make 规则
对于该源文件,冒号和所有包含文件的名称,
包括来自 -include 或 -imacros 命令行选项的那些。
...

此选项不会抑制预处理器的调试输出,例如 -dM。
为避免将此类调试输出与依赖规则混合,您应该明确
使用 -MF 指定依赖输出文件,
或使用像 DEPENDENCIES_OUTPUT 这样的环境变量...

于 2012-11-05T20:57:40.903 回答