2010-02-19 42 views
6

在下面的代码的环境,我想的THE_VERSION_STRING值从环境变量MY_VERSION的值在编译时采取如何使用C预处理,使包含用可变

namespace myPluginStrings { 
const char* pluginVendor = "me"; 
const char* pluginRequires = THE_VERSION_STRING; 
}; 

所以,如果我键入:

export MY_VERSION="2010.4" 

pluginRequires将在“2010.4”进行设置,即使MY_VERSION被设置为在运行时别的东西。

更新:(feb 21)感谢您的帮助。有用。 由于我使用Rake作为构建系统,因此我的每个CFLAGS都是一个ruby变量。这些值也需要以引号结尾。因此,对于我的gcc命令行必须是这样的:

gcc file.c -o file -D"PLUGIN_VERSION=\"6.5\"" 

这意味着这是我的Rakefile:

"-D\"PLUGIN_VERSION=\\\"#{ENV['MY_VERSION']}\\\"\"" 
+4

这不是预处理器会做的事情。这是你的构建系统必须要做的事情。 – GManNickG 2010-02-19 21:49:01

回答

13

如果我没有记错,您可以使用命令行参数-D用gcc到#define编译时的值。

即:

$ gcc file.c -o file -D"THE_VERSION_STRING=${THE_VERSION_STRING}" 
+0

不应该是'-DTHE_VERSION_STRING =“$(THE_VERSION_STRING)”'? – bk1e 2010-02-19 21:57:21

+0

@ bk1e是的,我认为你是对的 - 虽然文档实际上显示为'-D name = definition',所以也许没关系。 – Seth 2010-02-19 22:03:54

+0

@ bk1e:不用括号 - 括号可以工作,但不是必需的。 – 2010-02-19 22:56:46

0

在下面的代码,我想THE_VERSION_STRING的值从环境变量MY_VERSION的值在编译时采取

不,你不能这样做。提取环境变量的唯一方法是在运行时使用getenv()函数。您需要明确提取该值并将其复制到pluginRequires

如果您想要编译时常量的效果,那么您必须在编译器命令行中指定定义为Seth