保留取自环境变量的预处理器宏值中的空格

preserve whitespace in preprocessor macro value taken from environment variable

在一个 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"

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

#define STRINGIZE_NX(A) #A
#define STRINGIZE(A) STRINGIZE_NX(A)

static NSString *kWorkspace = @( STRINGIZE(BUILDSERVER_WORKSPACE) );

它的工作方式在这里得到了很好的解释:

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

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

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

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

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

HTH