静态本地的C与C ++初始化

时间:2011-10-05 19:30:02

标签: c++ c

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

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

在C ++中,这可以很好地编译而不会出现警告或错误。在C中我得到编译错误“初始化程序不是常量”。为什么两者之间有所不同?我正在为Visual Studio 2008使用VC9编译器。

我正在尝试将文件名作为输入,并在第一次设置文件的路径。所有进一步的回调都用于检查文件中的更新,但路径本身不允许更改。我在char const *?

中使用了正确的变量

3 个答案:

答案 0 :(得分:18)

因为C和C ++中的规则不同。

在C ++中,函数内的static变量在第一次到达代码块时被初始化,因此允许使用任何有效的表达式对它们进行初始化。

在C中,static变量在程序启动时初始化,因此它们需要是编译时常量。

答案 1 :(得分:2)

函数中的静态变量必须在编译时初始化。

这可能是你想要的:

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

答案 2 :(得分:1)

在C ++中,我更愿意沿着这些方向做点什么:

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