野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9443|回复: 9

extern 的使用的疑问?

[复制链接]
发表于 2014-1-10 12:20:15 | 显示全部楼层 |阅读模式
一个c工程里只有main.h和main.c两个文件  其中  main.h中有extern int a;               main.c中有int a;    这样的话编译不报错      按照我的理解     extern 是扩展一个变量到的作用范围到其他的c文件中   但是这样写 编译器也不报错  不知道是为什么  希望有高手能解答一下   谢谢!
回复

使用道具 举报

发表于 2014-1-10 13:26:39 | 显示全部楼层
我一直这样写的,一个.c文件,一个.h文件,.c文件用变量,.h扩展变量。。其他文件如果调用就要引入.h文件。。
回复 支持 反对

使用道具 举报

发表于 2014-1-10 15:38:31 | 显示全部楼层
这是C语言的知识,extern是声明外部的变量在本地使用,这个外部我理解的是非连接的两个文档。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-10 17:11:55 | 显示全部楼层
ahuzjh01 发表于 2014-1-10 15:38
这是C语言的知识,extern是声明外部的变量在本地使用,这个外部我理解的是非连接的两个文档。

但是按我的想法   在main.c文件中    包含了 main.h  main.h中又有extern int a;   这个不应该要报错么   
回复 支持 反对

使用道具 举报

发表于 2014-1-10 17:31:30 | 显示全部楼层
网上解释:典型的例子是在各.cpp文件中共享全局变量的问题:我们都知道,全局变量一般在.cpp文件中定义,在头文件中声明为extern  。难道不能在头文件中定义全局变量吗?
答案是肯定的。但是,定义在该头文件中的全局变量,只能被一个.cpp文件包含。就是说,某个.cpp文件包含了这个定义了全局变量的头文件后,其它的.cpp文件就不能再包含该头文件了。如果这样的头文件被多个.cpp文件包含,各.cpp文件编译时没有问题,但是链接时一定出现重复定义的错误。
难道在头文件中定义的全局变量只能被一个.cpp文件使用吗?
答案是否定的。如果你一定要在头文件中定义全局变量并在多个.cpp文件中使用,那么必须:
1. 该头文件只能被唯一一个.cpp文件包含,不能被其它.cpp文件包含
2. 在其它.cpp文件中使用该全局变量时,必须对该全局变量进行extern声明
回复 支持 反对

使用道具 举报

发表于 2014-1-10 17:33:40 | 显示全部楼层
飞鸿印雪 发表于 2014-1-10 17:11
但是按我的想法   在main.c文件中    包含了 main.h  main.h中又有extern int a;   这个不应该要报错么  ...

这是在编译连接过程中编译器需要处理的问题。extern在C和C++中可能还不一样。建议你可以在网上搜索一下“extern 在编译连接中的处理以及使用”
回复 支持 反对

使用道具 举报

发表于 2014-1-10 21:13:24 | 显示全部楼层
飞鸿印雪 发表于 2014-1-10 17:11
但是按我的想法   在main.c文件中    包含了 main.h  main.h中又有extern int a;   这个不应该要报错么  ...

这个是 很常见的 C语言 问题。

extern 用于声明 外部 已经 定义的 函数 或者 变量。

模块化编程,一般 声明 和 宏定义,都是 放在 头文件,然后 头文件 被 包含到 其他 *.c 文件,那么 其他 *.C 文件 就能用。

回复 支持 反对

使用道具 举报

发表于 2015-12-17 23:54:41 | 显示全部楼层
extern int a;
  仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。不是定义,所以在.c文件中int a并不会编译错误
回复 支持 反对

使用道具 举报

发表于 2018-1-11 12:04:40 | 显示全部楼层
需要注意的是,.h文件中 extern int a;这是在声明。以后 每一个#include 这个.h文件的.c文件 都可以使用这个变量了。你只定义了变量一次 ,其他的都是在引用.h文件里面的声明 所以  不会报错
回复 支持 反对

使用道具 举报

发表于 2018-1-12 08:55:18 | 显示全部楼层
danziqiu 发表于 2015-12-17 23:54
extern int a;
  仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中 ...

楼主正解,定义只能一次,声明可以有很多次。这里声明意思是允许其他c文件访问这个变量--全局变量,只要其他c文件包含了这个头文件,或者在其他文件中用extern再声明一次。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 16:19 , Processed in 0.031653 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表