如何在编译时找到环境变量?

时间:2010-08-11 13:57:22

标签: c++ environment-variables visual-studio-2005 c-preprocessor

我不知道这是不是一件好事,但我曾经在某个地方工作,每个人的计算机上都有像YOUR_NAME这样的环境变量。然后,如果您有一些自己感兴趣的调试代码,可以将其包装在#if defined( YOUR_NAME )中,除非将其更改为#if defined( YOUR_NAME ) || defined( THEIR_NAME ),否则甚至不会为其他人编译。

我刚尝试自己这样做,它似乎不起作用,重新启动Visual Studio,然后计算机,但它仍然似乎没有被拿起。这个hack还有比我理解的还要多,还是需要在Visual Studio中选择特定的版本/选项?

5 个答案:

答案 0 :(得分:5)

以IanH设置为基础,使用Visual Studio,

  • 右键单击Project Explorer面板中的项目名称。
  • 选择属性页
  • 打开配置属性,C / C ++,预处理器(即VS2008位置,但在vs2005中应该类似)
  • 对于预处理器定义,应该有 WIN32; _DEBUG 并且可能是其他人。最后,添加; YOUR_NAME =“$(YOUR_NAME)”
  • 请注意,evar YOUR_NAME中有空格感到非常不安,

答案 1 :(得分:2)

相当可怕的概念,但如果你真的想这样做,你可以在Visual Studio项目设置中指定一个预处理器定义,如下所示:YOUR_NAME=$(USERNAME)因为windows机器定义了%USERNAME%环境变量。如果您对从命令行(或在Makefile中)使用此功能感兴趣,可以将/DYOUR_NAME=%USER_NAME%指定为cl.exe的参数。

PS:尽管你所描述的是可能的,但你可能想重新考虑这种做法。如果您希望仅在某些情况下启用某些功能,请考虑使用启用/禁用某些功能的其他一些开关,例如:注册表值,配置文件以及您认为合理的任何其他标志。这至少可以保持所有同事测试相同二进制文件的可能性。这实际上是一种相当普遍的做法,有时会在continuous integration的环境中使用,这样您就可以尽早集成,但仍然不能让其他人等待您完成或修复该功能。一旦该功能甚至可以远程处理,就可以立即删除此条件开关。

答案 2 :(得分:1)

编辑:我没有尝试过我的答案,因为我目前正在Eclipse / Linux下工作,因此无法测试它,但我认为它应该可行。 (相应的Linux / Eclipse变体工作正常)。


您必须将编译器调用(或构建脚本/ Makefile)中的环境变量作为/ D%YOUR_NAME%开关传递。

为了避免在未定义%YOUR_NAME%时出现问题,您可以在其前面添加另一个字符串,例如

/D NAME_%YOUR_NAME%

然后你可以使用

#if defined(NAME_identitycrisisuk)

或您的用户名。

答案 3 :(得分:0)

你做不到。 C预处理器定义与环境变量完全无关。您必须让每个用户拥有自己的项目文件,并且每个用户都需要向项目文件本身添加一个额外的define指令,该指令将作为/ D开关传递给cl.exe

答案 4 :(得分:0)

我刚做了一个快速测试,显然VC ++ 2005并没有自动将环境变量转换为预处理器符号(它们是两个完全不同的东西)。

因此,您需要更改某些设置,以便每个用户都可以定义其符号。