我想检测Xcode设置之外的环境变量。我可以这样做,在运行时检查环境,如指定检测iOS应用程序在调试器中运行,但有办法做到这一点与这样的预处理宏?
#ifdef USER_GRADHA
// do some stuff
#else
// do other stuff
#endif
设置了我的环境变量,但是它没有到达.m文件的编译阶段。我希望在不修改项目的预处理器宏变量的情况下完成此任务,因为我希望对每个用户的编译是不同的,而无需他们修改它。
No。编译是一个非常明确的过程,不依赖于外部环境。我所知道的唯一方法是通过Xcode中的源树偏好来区分编译,这是为了让用户在不同机器上的不同位置保留源树,但构建设置是相同的(因为它可以参考首选项中的源树位置集)。
首先,如果您可以使用普通字符串而不是预处理器变量,请不要忘记getenv
将环境变量读入字符串。例如,
#include <stdlib.h>
char *ug = getenv("USER_GRADHA");
if (ug) {
//use the environment variable here
} else {
//it's NULL == undefined env variable (in all likelihood)
}
如果需要使用预处理器变量,shell可以在编译器调用时使用posix标准的-D或-U标志设置一个预处理器变量。不幸的是,简单的
gcc -DUSER_GRADHA=$USER_GRADHA file.c
可能会给您带来麻烦,因为如果环境变量未定义,您将有一个空白但已定义的预处理器变量。所以使用shell条件语句可能是最简单的,比如
if [ $USER_GRADHA ] ; then ug="-D$USER_GADHA"; else ug="-U$USER_GRADHA"; fi
c99 $ug file.c
这很容易在makefile或许多其他类型的钩子中实现,以执行任意shell代码进行编译。
最后,总是有Autotools,它是专门为这个基于环境信息编译的问题而设计的。你问的是Xcode,所以Autotools可能不适合你的工作流程(很多人不了解Autotools并立即忽略它),但如果你想要它就在那里。