【问题标题】:preserve whitespace in preprocessor macro value taken from environment variable在取自环境变量的预处理器宏值中保留空格
【发布时间】:2015-08-26 18:11:28
【问题描述】:

在一个 Objective-C 项目中,我试图从环境变量中获取文件路径并将其设置为写入生成文件的位置。这用于在自动测试环境中使用 xcodebuild 运行测试代码,在调用 xcodebuild 之前不会确定文件路径。

为了做到这一点,我在构建设置中输入了一个引用该变量的预处理器宏:

BUILDSERVER_WORKSPACE=\@\"$(WORKSPACE)\"

然后使用该宏设置字符串的值

NSString *workspaceLocation = BUILDSERVER_WORKSPACE;

如果$WORKSPACE 的路径(的字符串值)不包含空格,它可以正常工作,但在路径有空格的情况下,宏预处理器会将空格视为宏分隔符并尝试将它们处理为单独的宏定义。

例如:

$WORKSPACE=/foo/bar/thudblat

将workspacelocation的值设置为@"/foo/bar/thudblat" 但是

$WORKSPACE="/foo/bar/thud blat"

最终创建了多个预处理器定义:

#define BUILDSERVER_WORKSPACE @"/foo/bar/thud

#define blat"

我试图对路径进行字符串化,但是由于只有在我调用 xcodebuild 来构建然后运行时才会出现空格,所以我无法让它工作。

最后,我想要的是简单地采用$WORKSPACE 的路径并将其值设置为NSString *workspaceLocation

因此 workspaceLocation 可能是"\foo\bar\thud blat"

【问题讨论】:

  • 您不需要将整个宏表达式放在引号中吗? BUILDSERVER_WORKSPACE="\@\"$(WORKSPACE)\""
  • 这肯定会在 build 时获取环境变量的值,还是我遗漏了什么?
  • aha 好点,我正在运行它作为使用 xcodebuild 测试的一部分,所以它正在构建然后立即运行,所以它很可能在构建时评估这个宏.

标签: objective-c macros xcodebuild


【解决方案1】:

我以为我已经尝试了所有引用和转义的方案,但是我没有尝试过的一件事是引用@nielsbot 建议的整个内容 BUILDSERVER_WORKSPACE="\@\"$(WORKSPACE)\""

在整个 value 语句的开头和结尾处使用非转义引号。 Thad 成功了,并在调用 xcodebuild 时给了我字符串:@"/foo/bar/thud blat"。

【讨论】:

    【解决方案2】:

    您可以使用双字符串化技巧来实现:

    #define STRINGIZE_NX(A) #A
    #define STRINGIZE(A) STRINGIZE_NX(A)
    
    static NSString *kWorkspace = @( STRINGIZE(BUILDSERVER_WORKSPACE) );
    

    这里很好地解释了它的工作方式:https://stackoverflow.com/a/2751891/351305

    【讨论】:

      【解决方案3】:

      如果你想真正在运行时读取环境变量,那么你可以简单地从NSProcessInfo获取它:

      NSString *workspaceLocation = NSProcessInfo.processInfo.environment[@"WORKSPACE"];
      

      这将为您提供环境变量、空格和所有内容的当前值。

      HTH

      【讨论】:

      • 是的,请注意我在 xcode 构建中调用它时对编译时间与运行时的说明。 processinfo 为您提供当前执行上下文的运行时环境变量。值得注意的是,我的案例是在 iOS 模拟器上运行代码,该模拟器与调用 xcodebuild 的工作站没有相同的环境变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多