我正在寻找一种通过程序访问编译当前源文件的编译器的路径的方法(我假设这里有一个类似宏的东西,想想__FILE__
和朋友们(。理想情况下是独立于编译器的,但如果可能的话,我也不介意编译器特定的扩展(在这种情况下,最好是gcc(。
具体来看gcc,我查找了预定义的宏,但找不到任何内容。我要找的是这样的东西:
printf("The compiler that compiled this file is located at %sn", __COMPILERPATH__);
// -> "The compiler that compiled this file is located at /usr/bin/gcc"
但是没有__COMPILERPATH__
这样的东西。
如果使用gcc编译C程序,可以执行以下操作:
gcc -DCOMPILER_PATH="$(gcc --print-prog-name=cc1)" ...
例如:
文件:idgcc.c
#include <stdio.h>
#define STRINGIFY_(x) #x
#define STRINGIFY(x) STRINGIFY_(x)
int main(void) {
printf("Compiled with gcc v%d.%d.%d at %sn",
__GNUC__,
__GNUC_MINOR__,
__GNUC_PATCHLEVEL__,
STRINGIFY(COMPILER_PATH));
}
构建并运行
$ gcc-10 -DCOMPILER_PATH="$(gcc --print-prog-name=cc1)" idgcc.c && ./a.out
Compiled with gcc v10.1.0 at /usr/lib/gcc/x86_64-1-gnu/7/cc1
在C++中没有标准的方法。
一种简单的方法是在编译时将传递作为宏定义传递到编译器路径。它的语法是特定于编译器的,但构建系统生成器可以帮助实现这一点。
若std::embed提议被接受为未来的标准,那个么下面的技巧就可以起作用:std::embed("/proc/self/cmdline")
。但是,这是特定于Linux的。