编译前将终端输出插入源文件
Inserting terminal output into source file before compilation
我有一个 C++ 项目恰好存储在 Bazaar 存储库中。该项目还使用 #define
' 字符串来显示其版本号。有人刚刚问我们是否可以简单地将这个显示的版本号与 bzr 仓库修订号联系起来。
所以,在伪 C 中,伪 bash,类似于:
#define VERSION_STRING "revision $(bzr revno)"
//...
cout << "Starting " << VERSION_STRING;
左右。你会如何回答这个问题? makefile 运行 是一个将命令的输出插入到适当的源文件中的脚本吗?有没有宏解决方案?等等?
我对任何和所有聪明的解决方案都持开放态度,因为我在这个问题上画了一个有根据的空白。 =D
编译器会有一个标志来在外部定义一个宏值。对于 g++ 和 clang++,这是 -D
:
g++ -DVERSION_STRING="revision $(bzr revno)" file.cpp -c -o file.o
要在文件中将其作为字符串获取,您可以在定义中添加额外的引号:
g++ -DVERSION_STRING="\"revision $(bzr revno)"\" file.cpp -c -o file.o
或者您需要知道如何在文件中对该值进行字符串化,这需要一些时间 magic:
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
那你也可以有一个默认值。我建议编译器设置一个与您在内部使用的变量不同的变量,它有助于跟踪:
#include <iostream>
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
#ifdef VERSION
#define VERSION_STRING STRINGIFY(VERSION)
#else
#define VERSION_STRING "0.0.0"
#endif
int main()
{
std::cout << VERSION_STRING << '\n';
}
结果:
$ g++ -DVERSION="1.0.0" SO.cpp
$ ./a.out
1.0.0
$ g++ SO.cpp
$ ./a.out
0.0.0
注意,$(bzr revno)
是 运行 bzr revno
的语法,并将其输出 替换为 shell (bash 语法,在大多数其他语法中可能相同)。正如 musasabi 所指出的,在 makefile 中,语法略有不同:$(shell bzr revno)
、
我有一个 C++ 项目恰好存储在 Bazaar 存储库中。该项目还使用 #define
' 字符串来显示其版本号。有人刚刚问我们是否可以简单地将这个显示的版本号与 bzr 仓库修订号联系起来。
所以,在伪 C 中,伪 bash,类似于:
#define VERSION_STRING "revision $(bzr revno)"
//...
cout << "Starting " << VERSION_STRING;
左右。你会如何回答这个问题? makefile 运行 是一个将命令的输出插入到适当的源文件中的脚本吗?有没有宏解决方案?等等?
我对任何和所有聪明的解决方案都持开放态度,因为我在这个问题上画了一个有根据的空白。 =D
编译器会有一个标志来在外部定义一个宏值。对于 g++ 和 clang++,这是 -D
:
g++ -DVERSION_STRING="revision $(bzr revno)" file.cpp -c -o file.o
要在文件中将其作为字符串获取,您可以在定义中添加额外的引号:
g++ -DVERSION_STRING="\"revision $(bzr revno)"\" file.cpp -c -o file.o
或者您需要知道如何在文件中对该值进行字符串化,这需要一些时间 magic:
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
那你也可以有一个默认值。我建议编译器设置一个与您在内部使用的变量不同的变量,它有助于跟踪:
#include <iostream>
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
#ifdef VERSION
#define VERSION_STRING STRINGIFY(VERSION)
#else
#define VERSION_STRING "0.0.0"
#endif
int main()
{
std::cout << VERSION_STRING << '\n';
}
结果:
$ g++ -DVERSION="1.0.0" SO.cpp
$ ./a.out
1.0.0
$ g++ SO.cpp
$ ./a.out
0.0.0
注意,$(bzr revno)
是 运行 bzr revno
的语法,并将其输出 替换为 shell (bash 语法,在大多数其他语法中可能相同)。正如 musasabi 所指出的,在 makefile 中,语法略有不同:$(shell bzr revno)
、