2012-07-14 57 views
3

我在我的程序中很多次打電話CURRENT_DIR(見下文)。就像程序運行時可執行文件的路徑不會改變一樣,每當我調用這個函數時都沒有意義再次定義它。如何在一個只能定義一次的函數或宏函數中創建一個變量?

所以,我正在尋找一個解決方案,一旦這個值已經設置,它不應該再次設置。

我目前的解決方案是:將一個靜態變量的所有值設置爲0,並在if語句測試中檢查第一個字符是否爲非null,如果爲true,則設置它。但它看起來像一個不雅的..也許有一個更好的解決方案..通過使用包括宏的一些模型,我不知道。任何幫助和differents解決方案非常讚賞。我希望你明白這一點。提前致謝。

看到代碼:

#define CURRENT_DIR ({           \ 
    static char buffer[MAX_PATH + 1] = { 0 };   \ 
     if(buffer[0] != '\0')      \ 
    getcurrentdir(buffer, MAX_PATH);   \ 
     buffer;       \ 
}) 
+1

我應該添加「GCC」標籤,因爲這顯然是特定於GCC? (即表達陳述) – Mysticial 2012-07-14 03:51:13

+0

@Mysticial:我的錯誤。抱歉。編輯。 – Jack 2012-07-14 03:52:09

+0

不需要道歉。更多標籤增加了問題的可見性。 – Mysticial 2012-07-14 03:54:02

回答

5

而不是特定的gcc-表達式語句,我會使用的功能(如果需要的話可能inline d):

const char* currentDir(void) 
{ 
    static char buffer[MAX_PATH + 1] = { 0 }; 
    if (buffer[0] == '\0') 
    { 
     getcurrentdir(buffer, MAX_PATH); 
    } 
    return buffer; 
} 

這有幾個好處:

  • 它更便攜。 (當然,MAX_PATHgetcurrentdir會依賴於平臺。)
  • 它具有更好的類型安全性。如果字符串的意思是不變的,你不想讓客戶不小心修改它。

(gcc的表達式語句實現反正打破。該static變量不會被多個在同一範圍內重複使用CURRENT_DIR網站以及if測試是倒退,所以buffer將永遠不會被初始化爲一個非空字符串。)

相關問題