Chinaunix

标题: 静态变量为什么不能如此初始化? [打印本页]

作者: syoubin_sai    时间: 2010-09-03 16:51
标题: 静态变量为什么不能如此初始化?
  1. int get()
  2. {
  3.         return 1;
  4. }
  5. int for9()
  6. {
  7.         static int a = get ();
  8. }
复制代码
[root@hpc-rm thread]# gcc -S gas.c
gas.c: In function 'for9':
gas.c:28: error: initializer element is not constant

作者: hellioncu    时间: 2010-09-03 16:56
这样编译期没法确定值呀
作者: syoubin_sai    时间: 2010-09-03 17:00
静态变量初始化一定要const的值?
作者: efolzl    时间: 2010-09-03 17:05
回复 3# syoubin_sai


    initializer element is not constant

    编译器都说了,你就满足它吧
作者: syoubin_sai    时间: 2010-09-03 17:07
回复  syoubin_sai


    initializer element is not constant

    编译器都说了,你就满足它吧
efolzl 发表于 2010-09-03 17:05

oh,my god!该死的c99
作者: zhangsuozhu    时间: 2010-09-03 17:11
静态变量初始化是由编译完成的。程序还没有运行时,这个值就要定下来
作者: syoubin_sai    时间: 2010-09-03 17:19
静态变量初始化是由编译完成的。程序还没有运行时,这个值就要定下来
zhangsuozhu 发表于 2010-09-03 17:11



    这个很满意。原来是编译阶段初始化的
作者: caboy_cu    时间: 2010-09-03 20:34
cpp可以这样,c不可以

我记得是这样的
作者: rain_fish    时间: 2010-09-03 21:44
恩,是的
作者: 论坛ID    时间: 2010-09-04 09:06
本帖最后由 论坛ID 于 2010-09-05 15:04 编辑

做了个测试:
test.c
  1. int main()
  2. {
  3.     static int a;
  4.     a = 2;

  5.     return 0;
  6. }

复制代码
test.s


  1.                 .file        "test.c"
  2.         .def        ___main;        .scl        2;        .type        32;        .endef
  3.         .text
  4. .globl _main
  5.         .def        _main;        .scl        2;        .type        32;        .endef
  6. _main:
  7.         pushl        %ebp
  8.         movl        %esp, %ebp
  9.         andl        $-16, %esp
  10.         call        ___main
  11.         movl        $2, _a.1236
  12.         movl        $0, %eax
  13.         leave
  14.         ret
  15. .lcomm _a.1236,4,4

复制代码
显然a不是放在栈里面的
作者: pengjianbokobe    时间: 2010-09-04 12:41
回复 2# hellioncu


    请问什么变量在编译器值必须确定,什么变量在运行时确定??
作者: hellioncu    时间: 2010-09-04 12:45
回复  hellioncu


    请问什么变量在编译器值必须确定,什么变量在运行时确定??
pengjianbokobe 发表于 2010-09-04 12:41



    跟什么变量没关系。
主要那个是初始化,只能是常量。赋值就没这限制了,如

static int a;
a = get ();
作者: pengjianbokobe    时间: 2010-09-04 13:02
回复 12# hellioncu


    那什么类型的变量在初始化时必须是常量呢?谢谢
作者: tajial    时间: 2010-09-04 15:45
回复 13# pengjianbokobe
静态变量,全局变量
作者: flynetcn    时间: 2010-09-04 18:46
有初始值的静态变量和全局变量放在执行文件里时需要有初始值的,你提供的动态初始值,在生成执行文件时不能确定,没法编译通过呀。或者不给初始值或者用编译时可确定的值初始化。
作者: chinesedragon    时间: 2010-09-04 19:34
静态变电是在编译期初始化的
作者: caboy_cu    时间: 2010-09-04 20:45
试验过了,cpp里可以
作者: flynetcn    时间: 2010-09-04 21:41
试验过了,cpp里可以
caboy_cu 发表于 2010-09-04 20:45


c++智能一些,把这种动态赋值的静态变量直接当作未初始化的静态变量存放,在运行时赋值。只把能够编译时赋值的静态变量存放在已初始化数据段。
作者: caboy_cu    时间: 2010-09-04 22:03
c++智能一些,把这种动态赋值的静态变量直接当作未初始化的静态变量存放,在运行时赋值。只把能够编译时 ...
flynetcn 发表于 2010-09-04 21:41



对,我记得inside the cpp object model里有讲
作者: pengjianbokobe    时间: 2010-09-05 08:49
15楼




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2