你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于c语言外部变量调用问题

[复制链接]
木头子 提问时间:2014-3-27 13:58 /
本来,在一个文件中定义一个全局变量,在另一个文件中想要调用这个变量,在其前面加extern就可以了。可是今天看到这样的代码,一直弄不明白,希望大家帮忙解答:
在GlobalVariables.h文件中定义如下:
#ifndef  GlobalVariables__H__
#define  GlobalVariables__H__
typedef    unsigned  short     INT16U;  
typedef struct
{
 INT16U PeriodSum;
 
 INT16U Period_H_1;
 INT16U Period_L_1;
 INT16U Frequency_1;
 
 INT16U Period_H_2;
 INT16U Period_L_2;
 INT16U Frequency_2;

} MusicSettingStruct;
extern  MusicSettingStruct *Music;
#endif
然后在另一个文件funvtion.c中加入头文件#include "GlobalVariables.h",就这样Music竟然可以直接使用了。
GlobalVariables.h中是告诉编译器说它是外部已经定义的变量,使用了外部调用,可是Music根本就没有定义啊。我编译后发现居然可以编译通过。后来我自己重新建了一个工程,发现不可以,可是它的却可以通过,有人知道原因吗??
收藏 评论15 发布时间:2014-3-27 13:58

举报

15个回答
废鱼 回答时间:2014-3-27 15:08:11

RE:关于c语言外部变量调用问题

这个只是声明,你看一下,是不是别的地方定义了。
木头子 回答时间:2014-3-27 17:53:31

回复:关于c语言外部变量调用问题

回复第 2 楼 于2014-03-27 15:08:11发表:
这个只是声明,你看一下,是不是别的地方定义了。
 

已经查看了很多遍了,虽然有20多个文件,但是用过很多编译查询功能全部搜索出来,就是找不到它的定义,而且不止是一个,起码有20多个这样的变量都是没有找到它是从哪里调用过来 的
wkuang 回答时间:2014-3-27 21:50:36

RE:关于c语言外部变量调用问题

你看看工程中有没有包含库文件, 譬如.o文件,这些文件是c文件编译的结果,如果包含了.o表示对应的.o文件中已经定义了这个全局变量。
很多公司提供一些标准功能函数,但是为了保护其产权,只提供.h 和对应的.o 库文件。
肯定是这种问题, st官方历程就有这种情况
dlyt03 回答时间:2014-3-28 10:57:38

RE:关于c语言外部变量调用问题

肯定是有定义,再仔细查找一下吧,或许就像楼上说的那样
我爱下载 回答时间:2014-3-28 12:56:42

RE:关于c语言外部变量调用问题

这只是个定义,楼主还是程序中有定义,要不就是没有使用,可能编译器就是报出个警告,被你忽略了。还有就是代码被编译器优化掉了,根本没使用这个变量
灰小子-1888763 回答时间:2014-3-30 18:06:39

RE:关于c语言外部变量调用问题

在其他文件肯定有定义的,建议楼主再重新找找。或者提供代码,我帮你找
有缘于你 回答时间:2014-3-31 15:17:21

RE:关于c语言外部变量调用问题

Music 中也有头文件包含了#include "GlobalVariables.h"吧
木头子 回答时间:2014-3-31 16:26:19

回复:关于c语言外部变量调用问题

回复第 6 楼 于2014-03-28 12:56:42发表:
这只是个定义,楼主还是程序中有定义,要不就是没有使用,可能编译器就是报出个警告,被你忽略了。还有就是代码被编译器优化掉了,根本没使用这个变量 

怎么可能没有用这些变量,有20多个呢。真的所有文件都找过n遍,不止我一个人找,我们四个人一起都找不到。
木头子 回答时间:2014-3-31 16:26:35

回复:关于c语言外部变量调用问题

回复第 4 楼 于2014-03-27 21:50:36发表:
你看看工程中有没有包含库文件, 譬如.o文件,这些文件是c文件编译的结果,如果包含了.o表示对应的.o文件中已经定义了这个全局变量。
很多公司提供一些标准功能函数,但是为了保护其产权,只提供.h 和对应的.o 库文件。
肯定是这种问题, st官方历程就有这种情况 

那你又怎么知道.o文件里已经定义了,.o文件可是打不开的
木头子 回答时间:2014-3-31 16:29:22

回复:关于c语言外部变量调用问题

回复第 7 楼 于2014-03-30 18:06:39发表:
在其他文件肯定有定义的,建议楼主再重新找找。或者提供代码,我帮你找 

我们四个人一起找都找不到了,估计真的是没有定义,但是在它这个工程下,我们修改程序,这些变量完全可以使用。只要你自己建立一个新工程,那就不行了。
废鱼 回答时间:2014-3-31 17:12:15

RE:关于c语言外部变量调用问题

你用的是不是有.lib文件?
fengye5340 回答时间:2014-3-31 21:16:24

RE:关于c语言外部变量调用问题

.o 是编译生成的文件,怎么会包含函数呢。
一般作者为了保护部分代码,将部分代码生成了.lib文件,这样里面的函数和变量定义是无法通过搜索功能查到的,它只给出一个外部声明。

如果没搜到 Music可能被放到一个不是标准库命名方式的.lib中了,你在工程文件里面看看
木头子 回答时间:2014-4-1 11:51:21

回复:关于c语言外部变量调用问题

回复第 13 楼 于2014-03-31 21:16:24发表:
.o 是编译生成的文件,怎么会包含函数呢。
一般作者为了保护部分代码,将部分代码生成了.lib文件,这样里面的函数和变量定义是无法通过搜索功能查到的,它只给出一个外部声明。

如果没搜到 Music可能被放到一个不是标准库命名方式的.lib中了,你在工程文件里面看看
 
 
 
 
没有什么.lib文件,我把它所有.c和.h文件全部加到另一个新的工程中,发现也可以通过编译。但是如果你复制它工程里.c和.h的内容加入新工程,却是不行的。
估计没人知道是为啥了
dzc2001 回答时间:2014-4-2 16:54:22

RE:关于c语言外部变量调用问题

会不会是人家的lib文件里面定义了,我碰见过的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版