extern变量调用报错

前一段时间在应用extern变量时报错,今天花点时间来理清一下

extern 的功能很多,我想今天先理清一个问题,那就是extern 变量的声明和定义之间的关系。 

extern 可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其它模块中寻找其他定义。另外extern 也可以用来进行链接指定。

extern定义变量

1.使用extern 声明全局变量或函数时,一定要注意所有声明的变量或函数必须在且仅在一个源文件中实现定义。如:extern int a;//只是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现链接错误。

2.extern对变量的定义和声明

变量:extern int a;//声明一个全局变量a

      int a;//定义一个全局变量a

 

      extern int a=0;//定义一个全局变量a 并给初值

      int a = 0;//定义一个全局变量a 并给初值

      第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。他们看上去都一样,但是定义只能出现在一处,也就是说不管int a;还是extern int a=0;还是int a=0;都只能出现一次,而那个extern int a 可以出现很多次。当你要引用一个全局变量的时候,你就要声明extern int a;这时候不能省略,因为省略就变成int a;这是一个定义,不是声明

 

总结:

对于变量而言,如果你想在本源文件中使用另外一个源文件的变量,就需要在使用前用extern声明该变量,或者在头文件中用extern 声明该变量;

### STM32 中 `extern` 关键字的使用及其引发的编译和链接错误 在嵌入式编程环境中,尤其是针对STM32系列微控制器的应用开发过程中,`extern`关键字用于声明外部变量或函数。当遇到与`extern`相关的编译或链接错误时,通常是因为以下几个方面的原因: #### 变量未初始化或重复定义 如果一个全局变量被多个源文件中的`extern`语句引用,但是该变量只在一个地方进行了实际定义(即分配内存),那么其他地方应当仅限于声明而不能再次定义。否则可能会导致多重定义错误。 ```c // 正确的做法是在单个 .c 文件内定义并赋初值 int global_var = 0; // 在其他的 .h 或者 .c 文件中只需要这样声明即可 extern int global_var; ``` #### 函数原型不匹配 对于跨模块调用的函数来说,确保其返回型、参数列表的一致性非常重要。任何差异都可能导致连接阶段出现问题。例如,在头文件中声明了一个无参版本的函数而在实现部分却给了它形参,则会触发冲突。 ```c // 头文件 function.h 应保持一致 #ifndef FUNCTION_H_ #define FUNCTION_H_ void myFunction(void); #endif /*FUNCTION_H_*/ // 实现文件 function.c 同样要遵循上述接口约定 #include "function.h" void myFunction() { // Function body here... } ``` #### 忽略了必要的导入/导出指示符 似于汇编语言里的`EXPORT`和`IMPORT`伪指令[^1],C/C++也有似的机制来控制符号可见性和共享范围。特别是在多平台或多工具链环境下工作时,可能需要额外指定这些属性以防止潜在的问题发生。 ```c #ifdef __cplusplus extern "C" { // 如果混合使用 C 和 C++ #endif __attribute__((weak)) void weak_function(); // 对应于 WEAK 属性 #ifdef __cplusplus } // 结束 extern "C" #endif ``` #### 使用不当的命名空间或作用域修饰符 有时开发者会在不经意间改变了某些实体的作用域级别,比如把本应在公共区域暴露出来的资源隐藏了起来,这同样会造成无法解析的外部引用问题。 --- 为了有效排查由`extern`引起的具体错误信息,建议按照如下方法逐步验证: - **检查拼写**:确认所有涉及的名字完全相同; - **核对路径**:保证各个组件之间能够相互访问到对方所在的目录结构; - **清理构建产物**:有时候旧的目标文件残留也会干扰新代码的集成测试过程; 通过以上措施可以大大减少因误用`extern`而导致的各种异常状况的发生概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值