定义Extern变量

In one of your source files, you need to declare and define the variable in file-scope, outside of any functions. For example:

int foo;

In the other source files you just need to declare the variable (no definition):

extern int foo;

The easiest way is to put the extern in a some common header file which is included in your other source files.

Since you're using C++, I would recommend encapsulating the variable inside a namespace, at the very least.

Reference from:http://forums.whirlpool.net.au/archive/745569

<think>嗯,用户的问题是关于在C语言中头文件里定义extern变量后,在C文件中是否还需要重新定义extern变量。首先,我需要回顾一下C语言中extern关键字的作用和变量的声明与定义的区别。 我记得extern关键字用于声明一个变量,而不是定义它。声明是告诉编译器这个变量存在,但定义会分配存储空间。通常,在头文件中使用extern声明变量,这样多个源文件可以包含这个头文件,知道该变量的存在,而不会导致重复定义。 但用户的问题是,如果在头文件中已经用extern声明了变量,那么在C文件中是否需要再次用extern来声明?或者是否需要做其他处理?比如,是否需要在C文件中再次写extern,或者是否应该直接定义变量而不加extern。 根据C语言的规则,头文件中的extern声明只是告诉编译器这个变量在其他地方定义。因此,在某个C文件中,必须有一次(且仅一次)定义变量,即不使用extern关键字。如果在头文件中使用extern声明了一个变量,比如extern int a;,那么在某个C文件中需要定义int a;,否则链接时会报错,因为找不到变量定义。 所以,用户的问题的答案应该是:在头文件中使用extern声明变量后,在C文件中不需要(也不应该)再次使用extern来声明,而是需要在该C文件中定义这个变量,即不带extern关键字。否则,多个C文件包含该头文件后,每个C文件都会有extern声明,但没有实际的定义,导致链接错误。 不过,我需要确认是否正确。比如,如果在头文件里写了extern int a;,然后在C文件中再次写extern int a;,是否合法?或者是否需要省略extern? 根据C标准,声明可以有多次,但定义只能有一次。所以,在头文件中用extern声明变量是正确的做法,然后在某个C文件中定义变量(不带extern)。其他C文件包含头文件时,得到的是声明,而定义只出现一次。如果在C文件中再次写extern,那仍然只是声明,而不是定义,因此会导致变量未被定义,链接错误。 因此,正确的做法是头文件中用extern声明,C文件中不用extern,而是直接定义变量。比如: 头文件里: extern int a; C文件里: int a = 0; 这样,其他包含该头文件的C文件都知道a的存在,而实际的定义在某个C文件中完成。 所以,回答用户的问题:在头文件中用extern声明变量后,在C文件中不需要再使用extern来声明,而是需要在该C文件中定义变量(即不带extern)。如果C文件中再次使用extern,那只是声明而非定义,会导致链接错误,因为变量没有被实际定义。</think>在 C 语言中,`extern` 关键字用于**声明**变量而非定义变量。以下是关键步骤和解释: --- ### **1. 头文件中的 `extern` 声明** - **作用**:在头文件(`.h`)中用 `extern` 声明变量,目的是告诉编译器: *“此变量在其他源文件中已定义,此处仅声明其存在,不分配内存。”* 例如: ```c // example.h extern int global_var; // 声明变量(不分配内存) ``` --- ### **2. C 文件中的变量定义** - **必须定义一次(且仅一次)**:在某个源文件(`.c`)中需要**实际定义变量**(分配内存),此时**不能使用 `extern`**。例如: ```c // example.c int global_var = 0; // 定义变量(分配内存) ``` 若未定义,链接时会报错:`undefined reference to 'global_var'`。 --- ### **3. 其他 C 文件的使用** - **直接包含头文件即可**:其他源文件(如 `main.c`)通过包含头文件获取 `extern` 声明,直接使用变量: ```c // main.c #include "example.h" void func() { global_var = 42; // 合法使用(依赖头文件中的 extern 声明) } ``` --- ### **常见误区** 1. **重复使用 `extern`**: 在 `.c` 文件中再次用 `extern` 声明变量(如 `extern int global_var;`)会导致: - 声明有效,但变量仍未定义(需补充实际定义)。 - 若所有文件均只声明不定义,链接阶段会失败。 2. **头文件中直接定义变量**: 若在头文件中直接写 `int global_var;`,多个 `.c` 文件包含该头文件时会导致**重复定义**,引发链接错误。 --- ### **总结** - **头文件**:用 `extern` **声明**变量(告知存在性)。 - **C 文件**:在**一个且仅一个源文件**中**定义**变量(分配内存,不带 `extern`)。 - **其他文件**:通过包含头文件使用变量。 正确示例如下: ```c // config.h extern int config_value; // 声明 // config.c int config_value = 100; // 定义 // main.c #include "config.h" int main() { printf("%d", config_value); // 输出 100 return 0; } ``` 通过这种方式,可实现跨文件的全局变量共享,同时避免重复定义问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值