我有一个简单的程序如下:
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语言中,全局初始化语句的右值应该在编译时求值。
例如,
static const char* DeviceID = (char*) <——编译器可以计算"my_id"的地址。>
int length = strlen(DeviceID); <——但这不能在编译时。也就是说,我们应该运行这个过程才能知道它的价值。>
但是,c++不像上面那样关心。它可以在运行时初始化全局变量。所以如果你使用c++编译器,错误将会消失。