user-0 提问: 全局变量如何定义

回复:
user: user-1
content: 现在编辑器  生成.h的时候  会自动生成防止重复链接的关键字吧

user: user-2
content: zhao 专家的没错。。。都这么弄的， .h 里面 extern 在某个 .c文件中 声明了之后  其他 .c 文件都可以用  关键 还是防止重编译的问题

user: user-3
content: 引用 10 楼 xunfeng0862 的回复:谢谢各位牛的回复。赵老师说的方法不对，我已经试过，会有重复包含的问题。  可能同我的工作有关吧，我做嵌入式的，公司所有的全局变量都是定义在相对应的.h里面，如果别的文件要用，所有的文件都可以使用。  9楼的回复 我的第二点，第三点是不一样的，第二点最起码我在IAR上用是通不过的， 第三点可以，9楼可以试下。  我现在的做法是，在一个.h里面用extern int a, 其他的头文件里面直接int a.这样做行的通。  全局变量的定义到底同编译器有么有关系，欢迎各位畅所欲言，提供宝贵的意见，谢谢！ 我觉着zhao专家的说法没有什么问题。关键就是你怎么防止重复定义，也就是判断是否已经定义过。 多年之前使用C语言都是这样定义全局变量。 或者你可以参考一下系统的头文件定义，一般都会有几个全局变量之类的定义，比如windows.h之流。 仔细检查对比一下，应该能发现自己错误的原因。 至于你现在采取的.h里面用extern，然后在.c里面定义，只是绕开重复定义的一种方法，即只在一个地方定义，其它都是extern。 至于不美观的方法，应该是个人风格的原因。 你已经在.h里面extern定义了变量，其它.c文件只需要include这个.h文件就可以了，为什么还要extren定义呢

user: user-4
content: 头文件extern int g; 对应cpp,int g;

user: user-5
content: 嗯，可以这么说，一个.c或.h文件中，在函数以外定义的变量，就是全局变量。

user: user-6
content: 引用 10 楼 xunfeng0862 的回复: 最佳方式就是一个头文件，比如  /** x.h ***/   extern int x; 一个C文件 比如 /*** x.c ***/ int x = 0; 任何C文件  #include “x.h” 因为 extern int x; 是声明，不怕重复，可以在任何文件里重复任意次  如果非要一次定义，并定义在头文件里 那就学学μOS2 的方法 /***x.h ***/ #ifdef XXXX #define EXTERN_XXXX  #else  #define EXTERN_XXXX extern #endif   EXTERN_XXXX  int x; /**** x.c *****/ #define XXXX #include "x.h" /** 其它实现文件 **/ /*** y.c**/ #include "x.h"  也可以这么做 /****x.h *****/ #ifdef XXXXX int  x =0; #else extern int x; #endif  这样定义 在某个.C 中  例如 x.c  #define XXXXX #include "x.h" 其他.C /** y.c  **/ #include "x.h"  头文件加保护，防止重复包含 主要是某些声明定义和顺序有关的，比如结构 枚举，宏定义等等 重复包含就会出错  象函数原型声明，外部变量声明，类型的前置声明;这种只，只要形式一致，不论包含多少次，声明几次，都不会出现重复定义错误。  重复定义，包括重复包含，之所以会出现错误，主要是因为多处定义问题，多处声明并不会有问题。  函数，外部变量，类型的多处定义，一些宏定义，enum 定义，可能会导致重复定义错误。

user: user-7
content: #include就是原原本本把另一个文件的内容放到include的位置。  在一个C文件里定义变量，其他C文件里面extern变量 一个C文件里定义变量，H文件extern变量，其他C文件include这个H文件 这两个方式是一样的  LZ说通不过，发出错误警告和报错的代码看看

user: user-8
content: 不在任何函数里面定义的变量就是全局变量

user: user-0
content: 谢谢各位牛的回复。赵老师说的方法不对，我已经试过，会有重复包含的问题。  可能同我的工作有关吧，我做嵌入式的，公司所有的全局变量都是定义在相对应的.h里面，如果别的文件要用，所有的文件都可以使用。  9楼的回复 我的第二点，第三点是不一样的，第二点最起码我在IAR上用是通不过的， 第三点可以，9楼可以试下。  我现在的做法是，在一个.h里面用extern int a, 其他的头文件里面直接int a.这样做行的通。  全局变量的定义到底同编译器有么有关系，欢迎各位畅所欲言，提供宝贵的意见，谢谢！

user: user-9
content: 引用 楼主 xunfeng0862 的回复:1. 要在.h里面定义全局变量。所有文件都可以使用。  我用GCC， vc, keil编译器都没有问题，最近用IAR出现重复定义问题。  这种用法是错误的。除非你的这个头文件只用了一次。  引用 楼主 xunfeng0862 的回复:2. 不要说什么在.h里面用extern int a, 在.c里面用int a这样就可以，我试了行不通。  为什么不说，这是最常规的用法。  引用 楼主 xunfeng0862 的回复:3. 目前我的方法是在.c文件里面定义，其他文件要用的话用extern，但是这样做不美观。  这和 2 的用法是完全等价的。

user: user-10
content: 在头文件定义，然后其他源文件需要使用的时候直接#include 此头文件就好了！

user: user-11
content: IAR 肯定重包含文件了

user: user-12
content: 我是dsp， 我的全局变量是在一个C中定义，别的C extern

user: user-13
content: 1，理解头文件是什么，#Include做了什么事情。 2，理解编译和链接是干嘛的。

user: user-14
content: 在.c文件里定义 int xxx;在头文件里声明extern同时注意头文件要用宏包起来，防止重复包含，在需要用这个变量的.c里包含头文件

user: user-15
content: 引用2. 不要说什么在.h里面用extern int a, 在.c里面用int a这样就可以，我试了行不通。  把你所谓的不行的代码贴出来  我怀疑你自己写错了

user: user-16
content: 1.在.h文件中定义变量是大忌。 首先为什么要用.h文件？头文件提供的是接口，是被其他程序引用的。你在.h中定义了变量，其他程序include之后，在编译的时候会将.h文件展开。这时候，就会出现两个.c文件中定义了同名的变量。这样就会出现重复定义的问题。 2.因为1的原因，所以全局变量要在.c文件中定义。其他引用的地方使用extern声明。LZ说这么做不可以，还是贴代码看看吧。 3.这种做法为什么不美观了。。。

user: user-17
content: 在.h里面定义，并在.h文件 前面加 #ifndef _INC_THISFILE #define _INC_THISFILE 最后加 #endif  或者  前面加 #pragma once