如何在xcconfig和引号中定义字符串

问题描述 投票:0回答:1

我已经开始使用 xcconfig 文件进行环境特定的构建设置,并且我注意到字符串引号是按字面解释的。

例如

APP_BUNDLE_DISPLAYNAME_SUFFIX = "DEBUG"

将显示应用程序名称

MyApp "DEBUG"
作为显示名称(带引号)

如何处理 xcconfig 文件中的字符串,它们是否需要定义字符串? 如果不是,你如何处理空白和逃逸? 有什么需要注意的特殊字符吗?

ios xcode xcode6
1个回答
2
投票

答案是,这取决于您尝试更改的实际构建设置以及使用它的位置。

正如您所观察到的,像

APP_BUNDLE_DISPLAYNAME_SUFFIX
这样的设置只能采用单个单词,因此在此处添加引号只会导致 Xcode 将它们合并到设置的值中。

但是,在其他地方就不一样了。特别是,如果在构建期间将设置传递到工具链上。在这些情况下,您必须对 Xcode AND 命令行使用引用和转义。

例如:如果您想使用 xcconfig 文件来设置预处理器定义(即宏)并且您想定义字符串宏,则必须转义引号,以便 shell 不会删除它们,并且如果您有斜杠在字符串中,那么你还必须转义它们,因为 Xcode 在内部解释它们。

假设您的代码中有:

#ifdef MY_MACRO1
const char *my_url = MY_MACRO2;
#endif

其中 MY_MACRO2 应设置为带引号的字符串

"https://stackoverflow.com/questions/30926076/"
,则此 xcconfig 文件将正常工作:

//
//  my_string_macro.xcconfig
//

GCC_PREPROCESSOR_DEFINITIONS=MY_MACRO1 MY_MACRO2="\"https:\/\/stackoverflow.com\/questions\/30926076\/\"" 

Xcode 的 Build Settings 检查器将显示最外面两个双引号之间的值不变,但它会在编译过程中被正确解释,导致编译日志中出现类似以下内容:

clang -x objective-c++ -DMY_MACRO1 -DMY_MACRO2=\"https://stackoverflow.com/questions/30926076/\"
© www.soinside.com 2019 - 2024. All rights reserved.