在我的工程中有一个头文件a.h内容如下
////
static DWORD USER_ID;
static char USER_NAME[15];
////
在b.cpp中改变USER_ID及USER_NAME的值后,
在c.cpp中发现USER_ID及USER_NAME没有改变.
为什么会这样?怎么解决?

解决方案 »

  1.   

    static是静态变量,其值好像不能随便改变的,呵呵,不知道是不是我记错了,去掉static就应该可以了,如果他们是全局变量,在其他类用extern申明,如extern DWORD USER_ID;,就可以使用了
      

  2.   

    1.静态变量可以做全局变量
    2.全局变量默认extern,可以省略.
      

  3.   

    使用全局变量而不是静态变量,在.cpp里声明,在引用处加extern声明
      

  4.   

    static全局变量的作用域在文件(严格说是编译单元)内部。
    如果b.cpp和a.cpp都include了a.h,那么编译单元b和编译单元c中便各自有了各自的USER_ID和USER_NAME,而且他们互相没有关系,互不影响。而假如把a.h中的static关键字去掉,那么编译单元b和编译单元c中便同时定义了同样的USER_ID和USER_NAME,此时他们是一样的,所以必将造成变量重复定义的编译时错误。正确的做法是在b.cpp或者c.cpp当中的一个文件里定义变量,不用static(否则就成了文件内部的,其他文件无法访问),而在另外一个cpp文件中使用extern引用他们。以上这些仅仅是在讨论全局static变量,类中的static变量与此不尽相同。
      

  5.   

    正确的做法是在b.cpp或者c.cpp当中的一个文件里定义变量,不用static(否则就成了文件内部的,其他文件无法访问),而在另外一个cpp文件中使用extern引用他们。以上这些仅仅是在讨论全局static变量,类中的static变量与此不尽相同。
      

  6.   

    to:fanqing(火影忍者+26%)兄,先恭喜你赏月基础类排名第一,:)也顺便说一下,你说的“全局变量默认extern,可以省略”好像也不太正确,定义的时候是不需要的,但是在其他类使用的时候,必须先用extern申明吧,我实际碰到的都是这样的啊
      

  7.   

    正如steedhorse(晨星)分析的一样.但有没有方法能够在a.h里定义,而在b.cpp
    c.cpp里能够使用的方法呢.
    呵呵,忘了extern的方法,如果在b.cpp中定义了
    DWORD USER_ID;
    char USER_NAME[33];
    在c.cpp中怎么使用他啊,假如c.cpp中的
    func()
    {
    //这里要使用USER_ID,这是c.cpp里的函数.
    }
      

  8.   

    不好意思应该是函数extern可省略.
    引用:<xxx书>
    对于函数声明,extern是可选的,不带函数体的函数名连同参数表或返回值,自动作为一个声明.其实我觉得c++语法在编译器中有点不那么规范,尤其在vc++中.今天看了一本csdn的杂志,上面说在net2.0中vc++语法又有大变动,其中声明方法就变化了.
    晕到
    跟着跑,做火箭都赶不上啊!照这样下去vc++与c++可能会演变成vj++与java那种关系了.
      

  9.   

    我去看火影忍者124集了,下午在见fengqinggao
      

  10.   

    呵呵,我就干脆不跑了,.net都不打算学了,:)用法:
    func()
    {
    //这里要使用USER_ID,这是c.cpp里的函数.
    extern DWORD USER_ID;
    //下面就可以用USER_ID了
    }
      

  11.   

    “但有没有方法能够在a.h里定义,而在b.cpp,c.cpp里能够使用的方法呢.”
    一般头文件就是声明东西的,而cpp文件是定义东西的。许多时候都是这样。更常用的方法是在一个cpp文件里定义一个变量,在某个头文件中做extern引用声明,然后其他所有的cpp文件只要include了这个头文件,便也引用这个extern。不能忘记“include”一个文件在很大程度上跟直接拷贝那个文件内容没有区别。
      

  12.   

    //b.cpp
    ......
    DWORD USER_ID;
    char USER_NAME[33];
    ......
    //c.cpp
    extern DWORD USER_ID;
    extern char USER_NAME[33];func()
    {
    //这里要使用USER_ID,这是c.cpp里的函数.
    }