使用函数调用分配初始化全局变量

时间:2014-06-03 09:23:43

标签: c string

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

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

}

并且编译器抛出以下错误:

  

初始化元素不是常量

我不知道为什么编译器无法理解我的陈述:
strlen的原型类似于以下代码:

size_t strlen ( const char * str );

2 个答案:

答案 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应该在编译时进行评估 例如,

  
      
  1. static const char * DeviceID =(char *)“my id”; < - 编译器可以评估“my_id”的地址。所以,这是有效的。

  2.   
  3. int length = strlen(DeviceID); < - 但这不能在编译时。意味着,我们应该运行这个过程才能知道   它的价值。

  4.   

但是,C ++并不像上面那样关心。它可以在运行时初始化全局的。 因此,如果使用C ++编译器代替,则错误将消失。