user-0 提问: 有办法把一个项目中不同文件都用到的变量只定义一份吗？

回复:
user: user-1
content: 可以把变量写到共享内存里，供不同的进程使用

user: user-1
content: 可以把写到共享内存里，供不同的进程使用

user: user-2
content: 参考 Microsoft SDK\samples\winbase\SharedMem\Consumer.Cpp Microsoft SDK\samples\winbase\SharedMem\Makefile Microsoft SDK\samples\winbase\SharedMem\Producer.Cpp Microsoft SDK\samples\winbase\SharedMem\Queue.h Microsoft SDK\samples\winbase\SharedMem\ReadMe.Txt Microsoft SDK\samples\winbase\SharedMem\Common.h

user: user-0
content: 引用 16 楼 xunfeng0862 的回复:我这有一解法相当好用。 在main.h中如下定义： #ifdef ROOT #define EXTR #else #define EXTR extern #endif  然后在main函数中如下定义： #define ROOT #include "main.h"   其他的.c文件中直接 #include "main.h"  把你要定义的所有全局变量都申明放在各自的.h文件中，如EXTR unsigned char num;    这样所有的文件都可以使用了。 谢谢！这和楼上网友的推荐方法完全相同，只是你知道，如果一些变量需要初始化，怎么办？ 还有一些变量，是放在共享数据段里的，就是各进程共享的，这些变量有办法这样做吗？

user: user-0
content: 哦，我看错了，对不起，在头文件里调用了。谢谢！

user: user-0
content: 引用 4 楼 lhl1158612009 的回复:单独把变量放在一个源文件中。假定文件名为 var.h ， var.c  var.h 代码如下  #ifndef   _VAR_H_ #define _VAR_H_  #ifdef   VAR_T #define TYPE_D #else #define TYPE_D extern #endif  TYPE_D  int  test_var;  // 定义你自己的变量  //...  void Var_Init(void); //变量初始化函数，整个工程中调用一次就可以了   #endif  在 var.c 中，代码如下  #define VAR_T #include "var.h"  void Var_Init(void) { //.... }  在其他文件中要引用这些变量直接 include "var.h" 就可以了。  我已经用你的方法了，很好。只是最后有一点不明白，就是那个变量初始化函数。放在主程序的.cpp文件里面，可是它什么时候会被调用呢？好象没有看到调用它的语句。

user: user-3
content: #pragma declspec(selectany)

user: user-4
content: 引用 5 楼 zxh707wk 的回复:[quote=引用 2 楼 xiaohuh421 的回复:] 你的全局变量的定义就放在.cpp/.c文件中不变.  然后使用一个总的.h文件, 把所有这些全局变量的extern声明都放在其中.  比如:   a.cpp有变量  int a = 2; b.cpp有变量  int  b = 3; c.cpp有变量  int   c = 4;  可定义头文件声明: define.h extern int a; extern int b; extern int c;  使用的时间包含define.h即可.+1[/quote] +1

user: user-5
content: 我这有一解法相当好用。 在main.h中如下定义： #ifdef ROOT #define EXTR #else #define EXTR extern #endif  然后在main函数中如下定义： #define ROOT #include "main.h"   其他的.c文件中直接 #include "main.h"  把你要定义的所有全局变量都申明放在各自的.h文件中，如EXTR unsigned char num;    这样所有的文件都可以使用了。

user: user-6
content: VC共享段一般是，在DLL中定义的数据，各个进程共享的数据。 exe 也许也可以这样，不过如何引用是个问题。  通常，共享数据的定义和声明分开，这样问题会很简单。  也有人，试图只定义一次，但是要用点手段 μOS2就采用了一种办法，但是感觉还是不如，定义和声明分开简单。 详细的请看μOS2 源码，或者μOS2相关书籍。

user: user-2
content: public int a = 0;

user: user-0
content: 引用 8 楼 Intel0011 的回复:#ifndef   _VAR_H_ #define _VAR_H_  这两行后面似乎没有用到啊。  意思是，如果前面没有定义_VAR_H_，那么现在定义_VAR_H_ 它不需要有值，只是表明是否被定义过，它是为了防止头文件的重复定义 哦！明白了，非常感谢！ 那个变量放在共享数据段中的，如果也用这种方法定义，这样就会在每个文件中都定义一份，结果每个文件中都定义了一个同名共享数据段，恐怕不行，是吗？

user: user-7
content: 主c文件中放置 int a = 0;  在共用头文件中放置 extern int a;  所有的c文件中包含共用头文件

user: user-8
content: 引用 7 楼 screen12 的回复:另外还有我的一些全局变量是各进程共享的，放在一个共享段中：  #pragma data_seg("shared") 。。。 。。。 。。。 #pragma data_seg() #pragma comment(linker,"/SECTION:shared,RWS")  而且这个共享段中的数据还必须初始化，否则就不会放在这个共享段中。不知道这里面的全局变量有没有办法用上面的方法只定义一次？ 这个不能使用那种方法

user: user-8
content: #ifndef   _VAR_H_ #define _VAR_H_  这两行后面似乎没有用到啊。  意思是，如果前面没有定义_VAR_H_，那么现在定义_VAR_H_ 它不需要有值，只是表明是否被定义过，它是为了防止头文件的重复定义

user: user-0
content: 另外还有我的一些全局变量是各进程共享的，放在一个共享段中：  #pragma data_seg("shared") 。。。 。。。 。。。 #pragma data_seg() #pragma comment(linker,"/SECTION:shared,RWS")  而且这个共享段中的数据还必须初始化，否则就不会放在这个共享段中。不知道这里面的全局变量有没有办法用上面的方法只定义一次？

user: user-0
content: 引用 4 楼 lhl1158612009 的回复:单独把变量放在一个源文件中。假定文件名为 var.h ， var.c  var.h 代码如下  #ifndef   _VAR_H_ #define _VAR_H_  #ifdef   VAR_T #define TYPE_D #else #define TYPE_D extern #endif  TYPE_D  int  test_var;  // 定义你自己的变量  //...  void Var_Init(void); //变量初始化函数，整个工程中调用一次就可以了   #endif  在 var.c 中，代码如下  #define VAR_T #include "var.h"  void Var_Init(void) { //.... }  在其他文件中要引用这些变量直接 include "var.h" 就可以了。  谢谢！你这个方法很好，我大致看懂了，只是不知道最开头两行的用途：  #ifndef   _VAR_H_ #define _VAR_H_  这两行后面似乎没有用到啊。

user: user-9
content: 引用 2 楼 xiaohuh421 的回复:你的全局变量的定义就放在.cpp/.c文件中不变.  然后使用一个总的.h文件, 把所有这些全局变量的extern声明都放在其中.  比如:   a.cpp有变量  int a = 2; b.cpp有变量  int  b = 3; c.cpp有变量  int   c = 4;  可定义头文件声明: define.h extern int a; extern int b; extern int c;  使用的时间包含define.h即可.+1

user: user-10
content: 单独把变量放在一个源文件中。假定文件名为 var.h ， var.c  var.h 代码如下  #ifndef   _VAR_H_ #define _VAR_H_  #ifdef   VAR_T #define TYPE_D #else #define TYPE_D extern #endif  TYPE_D  int  test_var;  // 定义你自己的变量  //...  void Var_Init(void); //变量初始化函数，整个工程中调用一次就可以了   #endif  在 var.c 中，代码如下  #define VAR_T #include "var.h"  void Var_Init(void) { //.... }  在其他文件中要引用这些变量直接 include "var.h" 就可以了。

user: user-11
content: 楼上正解,用的时候还需要包含该头文件