我有一个简单的程序如下:
static const char* DeviceID = (char*)"my id";
int length = strlen(DeviceID);
int main(){
}
并且编译器抛出以下错误:
初始化元素不是常量
我不知道为什么编译器无法理解我的陈述:
strlen
的原型类似于以下代码:
size_t strlen ( const char * str );
答案 0 :(得分:1)
尝试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 '\0'
int main(void) {
/* ... */
}
答案 1 :(得分:0)
据我所知,当您尝试初始化全局变量时,C和C ++会有所不同。
在C中,全局初始化语句的Rvalue应该在编译时进行评估 例如,
static const char * DeviceID =(char *)“my id”; < - 编译器可以评估“my_id”的地址。所以,这是有效的。
- 醇>
int length = strlen(DeviceID); < - 但这不能在编译时。意味着,我们应该运行这个过程才能知道 它的价值。
但是,C ++并不像上面那样关心。它可以在运行时初始化全局的。 因此,如果使用C ++编译器代替,则错误将消失。