簡體   English   中英

靜態本地的C與C ++初始化

[英]C vs C++ initialization of static locals

我在C和C ++中都有以下代碼

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

在C ++中,這可以在沒有警告或錯誤的情況下編譯。 在CI中獲取編譯錯誤“初始化程序不是常量”。 為什么兩者之間有所不同? 我正在為Visual Studio 2008使用VC9編譯器。

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

因為C和C ++中的規則不同。

在C ++中,函數內部的static變量在第一次到達代碼塊時被初始化,因此允許使用任何有效的表達式對它們進行初始化。

在C中, static變量在程序啟動時初始化,因此它們需要是編譯時常量。

函數中的靜態變量必須在編譯時初始化。

這可能是你想要的:

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

在C ++中,我更願意沿着這些方向做點什么:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM