2011-10-05 25 views
4

我在C以下代碼和C++çVS C++靜態當地人的初始化

static void callback(char const* fname, int status) 
{ 
    static char const* szSection = fname; 
    //other stuff 
} 

在C++編譯這個沒有警告或錯誤的罰款。在C中,我得到編譯錯誤「初始化器不是常量」。它們之間爲什麼不同?我正在爲Visual Studio 2008使用VC9編譯器。

我想把一個文件名作爲輸入並且第一次設置文件的路徑。所有進一步的回調用於檢查文件中的更新,但不允許更改路徑本身。我在char const中使用了正確的變量嗎?

+1

請發佈您的所有代碼。我想我們可能會錯過一些東西。 – 2011-10-05 19:34:15

回答

18

由於規則是在C和C++不同。

在C++中,在函數內部static變量初始化獲得第一次的代碼塊被達到,所以他們允許任何有效的表達式進行初始化。

在C,static變量在程序開始初始化,所以他們需要的是一個編譯時間常數。

+1

+1這實際上比我自己的答案好。 –

+0

對於哪個*你*值得讚賞,imo。 –

1

在C++中,我更願意沿着這些路線做一些事情:

static void callback(char const* fname, int status) 
{ 
    static std::string section; 
    if(section.empty() && fname && strlen(fname)) 
    { 
    section = fname; 
    } 
    // other stuff 
} 
+0

我同意這是更好的C++代碼。我一定會用這個前進 –

2

函數靜態變量在編譯時被初始化。

這可能是你想要什麼:

static void callback(char const* fname, int status) 
{ 
    static char const* szSection = 0; 
    szSection = fname; 
    //other stuff 
} 
+2

哦確定,我可以使用類似像'如果(!szSection){szSection = FNAME}',以確保它只能設置一次 –

+0

實際上你可以,我是假設你想在每次通話時改變它。 –