关于c语言外部变量调用问题
本来,在一个文件中定义一个全局变量,在另一个文件中想要调用这个变量,在其前面加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根本就没有定义啊。我编译后发现居然可以编译通过。后来我自己重新建了一个工程,发现不可以,可是它的却可以通过,有人知道原因吗??
RE:关于c语言外部变量调用问题
这个只是声明,你看一下,是不是别的地方定义了。回复:关于c语言外部变量调用问题
回复第 2 楼 于2014-03-27 15:08:11发表:这个只是声明,你看一下,是不是别的地方定义了。
已经查看了很多遍了,虽然有20多个文件,但是用过很多编译查询功能全部搜索出来,就是找不到它的定义,而且不止是一个,起码有20多个这样的变量都是没有找到它是从哪里调用过来 的
RE:关于c语言外部变量调用问题
你看看工程中有没有包含库文件, 譬如.o文件,这些文件是c文件编译的结果,如果包含了.o表示对应的.o文件中已经定义了这个全局变量。很多公司提供一些标准功能函数,但是为了保护其产权,只提供.h 和对应的.o 库文件。
肯定是这种问题, st官方历程就有这种情况
RE:关于c语言外部变量调用问题
肯定是有定义,再仔细查找一下吧,或许就像楼上说的那样RE:关于c语言外部变量调用问题
这只是个定义,楼主还是程序中有定义,要不就是没有使用,可能编译器就是报出个警告,被你忽略了。还有就是代码被编译器优化掉了,根本没使用这个变量RE:关于c语言外部变量调用问题
在其他文件肯定有定义的,建议楼主再重新找找。或者提供代码,我帮你找RE:关于c语言外部变量调用问题
Music 中也有头文件包含了#include "GlobalVariables.h"吧回复:关于c语言外部变量调用问题
回复第 6 楼 于2014-03-28 12:56:42发表:这只是个定义,楼主还是程序中有定义,要不就是没有使用,可能编译器就是报出个警告,被你忽略了。还有就是代码被编译器优化掉了,根本没使用这个变量
怎么可能没有用这些变量,有20多个呢。真的所有文件都找过n遍,不止我一个人找,我们四个人一起都找不到。
回复:关于c语言外部变量调用问题
回复第 4 楼 于2014-03-27 21:50:36发表:你看看工程中有没有包含库文件, 譬如.o文件,这些文件是c文件编译的结果,如果包含了.o表示对应的.o文件中已经定义了这个全局变量。
很多公司提供一些标准功能函数,但是为了保护其产权,只提供.h 和对应的.o 库文件。
肯定是这种问题, st官方历程就有这种情况
那你又怎么知道.o文件里已经定义了,.o文件可是打不开的
回复:关于c语言外部变量调用问题
回复第 7 楼 于2014-03-30 18:06:39发表:在其他文件肯定有定义的,建议楼主再重新找找。或者提供代码,我帮你找
我们四个人一起找都找不到了,估计真的是没有定义,但是在它这个工程下,我们修改程序,这些变量完全可以使用。只要你自己建立一个新工程,那就不行了。
RE:关于c语言外部变量调用问题
你用的是不是有.lib文件?RE:关于c语言外部变量调用问题
.o 是编译生成的文件,怎么会包含函数呢。一般作者为了保护部分代码,将部分代码生成了.lib文件,这样里面的函数和变量定义是无法通过搜索功能查到的,它只给出一个外部声明。
如果没搜到 Music可能被放到一个不是标准库命名方式的.lib中了,你在工程文件里面看看
回复:关于c语言外部变量调用问题
回复第 13 楼 于2014-03-31 21:16:24发表:.o 是编译生成的文件,怎么会包含函数呢。
一般作者为了保护部分代码,将部分代码生成了.lib文件,这样里面的函数和变量定义是无法通过搜索功能查到的,它只给出一个外部声明。
如果没搜到 Music可能被放到一个不是标准库命名方式的.lib中了,你在工程文件里面看看
没有什么.lib文件,我把它所有.c和.h文件全部加到另一个新的工程中,发现也可以通过编译。但是如果你复制它工程里.c和.h的内容加入新工程,却是不行的。
估计没人知道是为啥了
RE:关于c语言外部变量调用问题
会不会是人家的lib文件里面定义了,我碰见过的
页:
[1]