【问题标题】:How can you find whether an environment variable exists at compile time?如何在编译时找到环境变量是否存在?
【发布时间】:2023-03-20 05:01:01
【问题描述】:

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

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

【问题讨论】:

  • @Neil 为什么没有?就像我说的那样,我不知道这是否是一件特别好的事情,只是想再次使用它并且不记得它特别复杂。
  • 对不同的人编译不同的代码?不用了!
  • 在代码库中只为你工作的代码与其他 50 位开发人员 = 有时最好的东西:D

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


【解决方案1】:

在 IanH 设置的基础上,使用 Visual Studio,

  • 右键单击项目资源管理器面板中的项目名称。
  • 选择属性页
  • 打开配置属性、C/C++、预处理器(即VS2008的位置,但在VS2005中应该类似)
  • 对于预处理器定义,应该有 WIN32;_DEBUG 并且可能还有其他。最后,添加 ;YOUR_NAME="$(YOUR_NAME)"
  • 请注意,如果 evar YOUR_NAME 中有一个空格,会让人非常不安,

【讨论】:

  • 这似乎最接近预期的效果,我一定是记错了设置,如果您只是将 $(YOUR_NAME) 放在预处理器 defs 中似乎没问题?这意味着我也可以将其添加到调试版本中,因此不可能发布具有计算机独有行为的版本,它主要用于整理其他人不感兴趣的额外调试输出。
  • 仅添加 $(Your_name) 就像说 #define James_Curran
  • 是的,这是想要的效果,我认为最初的问题描述得不是很好,因为我记错了。
【解决方案2】:

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

PS:即使您描述的内容是可能的,您也可能需要重新考虑这种做法。如果您希望仅在某些情况下启用某些功能,请考虑使用一些其他开关来启用/禁用某些功能,例如:注册表值、配置文件和您认为合理的任何其他标志。这至少可以保持相同二进制文件被您所有同事测试的可能性。这实际上是一种相当普遍的做法,有时在具有continuous integration 的环境中使用,这样您就可以尽早集成并且仍然不会让其他人等待您完成或修复该功能。这个条件开关当然会被移除,只要该功能似乎已经准备好与您的产品的其余部分很好地配合使用。

【讨论】:

  • 使用像这样的源级解决方案,您可以提交一个实际上无法为其他人构建的代码,例如 #ifdef COLLEGUE_NAME ... int something = ... 请填写此内容 ;] 所以这家伙会知道它有艰巨的任务:d
【解决方案3】:

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


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

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

/D NAME_%YOUR_NAME%

然后就可以使用了

#if defined(NAME_identitycrisisuk)

或者你的用户名是什么。

【讨论】:

  • 在 makefile 中使用 !if 测试环境变量也很常见。
【解决方案4】:

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

【讨论】:

  • 我喜欢 3 多年前的答案被否决,这是准确的,实际上与在同一问题中接受 +5 的答案相匹配。太棒了。
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多