1

我不是特別知道這是否是件好事,但我曾經工作過的地方每個人在他們的計算機上都有一個像YOUR_NAME這樣的環境變量。那麼如果你有一些只是你自己感興趣的調試代碼,你可以將它包裝在#if defined(YOUR_NAME)中,除非它們將其更改爲#if defined(YOUR_NAME) || defined(THEIR_NAME),否則它甚至不會編譯給其他人。如何在編譯時查找環境變量是否存在?

我剛纔試圖自己做這件事,它似乎並沒有工作,重新啓動Visual Studio,然後電腦,但它似乎仍然沒有拿起。還有更多的這個黑客比我理解或需要在Visual Studio中選擇特定的版本/選項?

+0

噢,不要! – 2010-08-11 14:02:13

+0

@尼爾爲什麼noooo?就像我說的,我不知道這是否是一件特別好事,但只是想再次使用它,並不記得它特別複雜。 – identitycrisisuk 2010-08-11 14:19:14

+5

針對不同人編寫不同的代碼?不用了,謝謝! – 2010-08-11 14:24:23

回答

5

什麼大廈IanH集,從withing Visual Studio中,

  • 權在Project Explorer面板中點擊項目名稱。
  • 選擇屬性頁
  • 打開配置屬性,C/C++,預處理器(也就是VS2008的位置,但它應該是在VS2005相似)
  • 對於預處理定義,應該有WIN32,_DEBUG和prehaps其他。最後,加; YOUR_NAME =「$(YOUR_NAME)」
  • 注意,它變得非常懊惱的就是沒有在EVAR YOUR_NAME空間,
+0

這似乎與預期的效果最接近,我必須誤解設置,如果您只是將$(YOUR_NAME)放入預處理器defs,看起來很好?這意味着我也可以將它添加到調試版本中,因此沒有機會獲得具有計算機特有行爲的版本版本,它主要用於整理其他人無需感興趣的額外調試輸出。 – identitycrisisuk 2010-08-12 14:27:12

+0

只需添加$(Your_name)就像是說'#define James_Curran' – 2010-08-12 14:37:33

+0

是的,這是所期望的效果,我不認爲最初的問題描述得很好,因爲我誤解了它。 – identitycrisisuk 2010-08-13 10:37:21

0

你不能。 C預處理器定義與環境變量完全無關。您必須讓每個用戶擁有自己的項目文件,並且每個用戶需要向項目文件本身添加一個額外的定義指令,該指令將作爲/ D開關傳遞給cl.exe

+1

我喜歡當我3年前得到答案downvote,這是準確的,而事實上匹配的答案有+ 5在同一問題中接受。真棒。 – 2013-10-02 19:09:52

0

我只是做了一個快速測試,顯然VC++ 2005不會自動將環境變量轉換爲預處理器符號(它們是兩個完全不同的東西)。

所以你需要改變一些設置,以便每個用戶都可以定義他的符號。

1

編輯:我沒有試過我的答案,因爲我目前在Eclipse/Linux下工作,因此無法測試它,但我認爲它應該可以工作。 (相應的Linux/Eclipse變體工作正常)。


您必須將編譯器調用(或構建腳本/ Makefile)中的環境變量作爲/ D%YOUR_NAME%開關傳遞。

爲避免未定義%YOUR_NAME%時出現問題,您可以在其前面添加另一個字符串,例如,

/D NAME_%YOUR_NAME% 

然後你可以使用

#if defined(NAME_identitycrisisuk) 

或任何你的用戶名。

+0

使用!如果在makefile中測試環境變量也很常見。 – 2010-08-11 14:57:01

2

相當可怕的概念,但如果你真的想要做到這一點,您可以在Visual Studio項目設置中指定預處理程序定義,如下所示:YOUR_NAME=$(USERNAME)因爲Windows機器已定義了%USERNAME%環境變量。如果您有興趣從命令行(或針對該問題的Makefile中)使用此命令,則可以指定/DYOUR_NAME=%USER_NAME%作爲cl.exe的參數。 PS:儘管你描述的是可能的,但你可能想重新考慮這種做法。如果您希望僅在特定情況下啓用某些功能,請考慮使用其他一些啓用/禁用某些功能的開關,例如:註冊表值,配置文件以及您認爲合理的任何其他標誌。這至少會保證您的所有同事都可以測試相同的二進制文件。這實際上是一種相當常見的做法,有時在環境中使用,因此您可以儘早整合,但仍然不會讓其他人等待您完成或修復功能。只要該功能遠程似乎已準備好與其他產品配合使用,該條件開關當然會被刪除。

+0

與這樣的源代碼級解決方案,你可以提交一個代碼,實際上將失敗爲其他人建設,例如#ifdef COLLEGUE_NAME ... int something = ...請填寫這個;] 所以這傢伙會知道它有艱鉅的任務:d – 2014-11-17 10:37:10

相關問題