我在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 *?
中使用了正确的变量答案 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
}