深入理解C语言中的extern关键字:变量与指针的声明差异

1 基本说明

深入理解C语言中的extern关键字:变量与指针的声明差异

extern 可以放在变量或函数之前,表示该变量或函数的定义在另一个文件中,提示编译器遇到这个变量或函数时到其他模块中查找其定义。

另外,extern也可以用于链接规范。

2 问题:外部变量

数组在源文件中定义:

字符a;

它在另一个文件中声明如下:

外部字符*a;

对不起,这样可以吗?

答案及分析:

1).不会,程序运行时会通知您非法访问。原因是指向 T 类型的指针不等于 T 类型的数组。 extern char

*a声明的是指针变量而不是字符数组,因此与实际定义不同,导致运行时非法访问。该声明应更改为 extern char a。

2)。实例分析如下。如果a = "abcd",那么外部变量a=0x61626364(abcd的ASCII码值),*a显然没有意义。

显然a(0x61626364)指向的空间是没有意义的,并且容易出现非法内存访问。

3)。这就提醒我们,在使用extern的时候,一定要严格对应声明的格式。在实际编程中,这样的错误是很常见的。

4)extern常用于变量声明。您在 *.c 文件中声明一个全局变量。如果这个全局变量要被引用,则将其放在*.h中并用extern声明。

3 问题:外部函数1

经常看到 extern 被放在函数前面,成为函数声明的一部分。那么,C语言关键字extern在函数声明中起什么作用呢?

答案及分析:

如果函数的声明中包含关键字 extern,则仅暗示该函数可以在其他源文件中定义,而没有其他作用。也就是说,下面两个函数声明没有明显的区别:

外部 int f();和 int f();

当然这种用途还是存在的,就是替换程序中的include。

“*.h”来声明函数。在一些复杂的项目中,我更习惯在所有函数声明之前添加 extern 修饰。

4 问题:外部函数2

当函数提供者单方面修改函数原型时,如果用户在不知情的情况下继续使用原来的extern声明,编译器在编译时不会报错。然而,在运行过程中,经常会由于输入参数缺失或过多而导致系统出现错误。这种情况应该如何解决呢?

答案及分析:

目前业界还没有完善的解决方案来处理这种情况。通常的做法是提供者在自己的 xxx_pub.h 中提供外部接口的声明,然后调用者包含头文件,从而消除了 extern 步骤。以避免此错误。

剑有两个刃。应用extern时,应根据不同的情况选择不同的方法。

5 问题:外部“C”

在C++环境中使用C函数时,经常会出现编译器在obj模块中找不到C函数定义,导致链接失败的情况。这种情况该如何解决呢?

答案及分析:

C++语言为了解决编译时函数的多态问题,会将函数名和参数结合起来生成中间函数名,但C语言不会,所以在链接时会找不到对应的函数。这时候C函数就需要使用extern

“C”制定了链接规范,它告诉编译器,请保留我的名字,不要给我一个用于生成链接的中间函数名称。

以下是标准的写法:

//位于.h文件的头部

#ifdef __cplusplus

#如果__cplusplu*

**捷恩“C”{

#endif

#endif

……

……

//.h文件结束的地方

#ifdef __cplusplus

#if __cplusplus

#endif

#endif

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

88阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

78阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读