在C++中使用环境变量作为编译时常量

10
作为构建过程的一部分,我需要使用批处理脚本定义的环境变量,并在编译时将其用作代码中的常量。
例如,假设我已经定义了一个名为“BUILD_VERSION”的环境变量,并将其设置为“1.0.0”,则在编译时,我希望“1.0.0”被嵌入到我的代码中。例如:
批处理文件:
set BUILD_VERSION = 1.0.0
; call vs compiler

C++ 文件:

const std::string build_version = BUILD_VERSION // Which will result in "1.0.0".

我该如何做到这一点?

1
/DBUILD_VERSION="1.0.0" 不起作用吗? - txtechhelp
那可能正是我想要的。现在会尝试一下。 - matthewrdev
1
请注意,根据您的定义方式,您可能需要将宏字符串化(即 build_version = #BUILD_VERSION)。 - txtechhelp
太棒了!那个很有效。你能回答问题让我可以接受吗? :) - matthewrdev
我会接受你的答案;你有图片,我只是想放一些文字 ;) 但我很高兴能帮到你 :) - txtechhelp
3个回答

10
最终,我按照 txchelp 的建议,在项目属性的“命令行 -> 附加选项”部分中添加了一个 /D 标志,将环境变量声明为预处理器定义。
它看起来像这样:

enter image description here

然后,在启动构建的批处理脚本中:
set SVN_BUILD_VERSION=1.0.0

最后,将其作为字符串从源代码中提取:
#define STRINGIZER(arg)     #arg
#define STR_VALUE(arg)      STRINGIZER(arg)
#define BUILD_VERSION_STRING STR_VALUE(BUILD_VERSION)

// ...

const std::string version = BUILD_VERSION_STRING; // Results in "1.0.0".

0

你可以使用一个预构建步骤(我假设你在使用Visual Studio),它将运行脚本,该脚本将获取此环境变量值,解析C++源文件并将值从“1.0.0.0”更改为“1.0.0.1”。

这种替换可以方便地通过awk完成。


0

一个VERSION_INFO资源可能是一个不错的选择。

嵌入的版本信息可以通过右键单击可执行文件并检查其属性来检查。

要在命令行中执行此操作:

  • 将批处理文件的输出重定向到定义资源的[.rc]文件中。

  • 使用rc.exe编译资源。

  • 通过简单地将其传递给链接器来嵌入生成的.res文件。

在Visual Studio中可能会更加复杂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接