2011-10-20 64 views
2

我想检测Xcode设置以外的环境变量。我可以在运行时检查Detecting if iOS app is run in debugger中指定的环境,但是有没有办法用这样的预处理器宏来实现?如何在不更改Xcode项目的情况下#ifdef一个环境变量?

#ifdef USER_GRADHA 
    // do some stuff 
#else 
    // do other stuff 
#endif 

我的环境变量已设置,但未达到.m文件的编译阶段。我希望在不修改项目的预处理器宏变量的情况下完成此操作,因为我希望每个用户的编译都不同,而不必修改它们。

回答

2

否。编译非常有意为确定性过程,并且不依赖于外部环境。我知道编译根据谁编译会有所不同的唯一方法是通过Xcode中的源代码树偏好设置,这明确是为了让用户将源代码树保存在不同机器上的不同位置,但具有相同的构建设置(因为它可以参考偏好中设置的源树位置)。

0

首先,不要忘记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) 
} 

如果你需要有一个预处理器变量,外壳可以在编译器调用使用POSIX标准的-D或-U标志设置一个。不幸的是,简单的

gcc -DUSER_GRADHA=$USER_GRADHA file.c 

很可能给你造成麻烦,因为如果环境变量是不确定的,你就会有一个空白,但定义的预处理器变量。因此,它可能是最容易使用的壳条件,像

if [ $USER_GRADHA ] ; then ug="-D$USER_GADHA"; else ug="-U$USER_GRADHA"; fi 
c99 $ug file.c 

这是很容易在makefile或许多其他类型的挂钩来实现,以编译执行任意shell代码。

最后,总有自动工具,这是专为编制依据有关环境信息的正是这个问题。你问到的Xcode,所以自动工具可能不适合您的工作流程(和很多人不理解自动工具,并驳回了手),但如果你想它,它的存在。

相关问题