2011-10-20 65 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,所以自動工具可能不適合您的工作流程(和很多人不理解自動工具,並駁回了手),但如果你想它,它的存在。

相關問題