获取作为编译器参数传递的所有宏的列表的最佳方法是什么?

What's the best way to get a list of all the macros passed as compiler arguments?

我正在开发一个代码库,该代码库通过作为参数传递给编译器的宏使用相当多的条件编译(即 gcc -DMACRO_HERE file.cpp)。我想有一种方法来获取代码中以这种方式定义的所有宏的列表,以便我可以将所有使用的宏写到控制台并在应用程序为 运行 时保存文件,这样我们确切知道使用了什么版本。

我还需要对 git 散列做同样的事情,但我想我可以用宏轻松地做到这一点。

编辑 1:请注意,这与 GCC dump preprocessor defines 不是同一个问题,因为我希望列表 程序中可用,并且我只需要声明的宏通过使用 -D 参数

传递给编译器

编辑 2:我还需要它与交叉编译器兼容,因为我们使用 GCC、XL、CCE、CLANG、NVCC、HIP 和它们的 MPI 版本。请注意,我们正在使用 Make

构建

这是一个可能的解决方案的概要。

请求不是 well-specified,因为不能保证所有目标文件都将使用相同的条件宏构建。因此,假设您要捕获为某个指定源文件指定的条件宏。

在此基础上,我们可以玩一个构建技巧,使用 make 很容易做到:指定源文件的构建配方实际上调用了一个脚本,方法是在脚本的开头插入脚本的路径编译行。

该脚本遍历其参数,选择以 -D 开头的参数,并使用它们创建一个简单的 C 源文件,该文件定义了一个数组 const char* build_options[],并使用字符串化版本的命令行参数。 (除非你是一个完美主义者,否则你不需要做英雄来正确地转义字符串,因为没有理智的构建配置会使用需要英雄转义的 -D 参数。)

构建源文件后,脚本会保存它并使用 command-line 它作为参数传递来编译它,或者将其留给稍后的构建步骤进行编译。