用函数调用赋值初始化全局变量



我有一个简单的程序如下:

static const char* DeviceID = (char*)"my id";
int length = strlen(DeviceID);
int main(){
}

,编译器抛出以下错误:

初始化项元素不是常量

我不知道为什么编译器不能理解我的语句:
strlen的原型如下代码:

size_t strlen ( const char * str );

试试sizeof,这会产生一个编译时间常数

#define MY_ID "my id"
static const char *DeviceID = MY_ID;  // no cast needed
int length = sizeof MY_ID - 1;        // sizeof also includes the ''
int main(void) {
    /* ... */
}

据我所知,当你试图初始化全局变量时,C和c++是不同的。

在C语言中,全局初始化语句的右值应该在编译时求值。
例如,

  1. static const char* DeviceID = (char*) <——编译器可以计算"my_id"的地址。>

  2. int length = strlen(DeviceID); <——但这不能在编译时。也就是说,我们应该运行这个过程才能知道它的价值。>

但是,c++不像上面那样关心。它可以在运行时初始化全局变量。所以如果你使用c++编译器,错误将会消失。

最新更新