(求助!在线等!)在一个文件中定义了结构体,但是在另一个cpp中引用该struct.

xbottle 2008-12-18 10:59:37
简单说就是在一个文件中定义了结构体,但是在另一个cpp中引用该struct.

我是这样写的:
代码是这样:
void CAudRating0View::OnDraw(CDC* pDC/*pDC*/)
{
#if 1
float fFieldvalue;
CString strText;

fFieldvalue = (g_audi_param.AllTouch_Count / g_audi_param.AllPeople_Count*100);
//fFieldvalue = (9.2/ 221*100);
CAudRating0Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
strText.Format(_T("%f"),fFieldvalue);
pDC->TextOut(0,0,strText);
// TODO: 在此处为本机数据添加绘制代码
#endif
}

其中,g_audi_param是在另一个c文件中定义的,而在当前文件用的是“extern audi_param g_audi_param;”

这是在生成的时候的提示:

------ 已启动全部重新生成: 项目: AudRating0, 配置: Debug Win32 ------
正在删除项目“AudRating0”(配置“Debug|Win32”)的中间文件和输出文件
正在编译...
stdafx.cpp
正在编译...
AudRating0.cpp
AudRating0Doc.cpp
AudRating0View.cpp
MainFrm.cpp
正在生成代码...
正在编译资源...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation. All rights reserved.
正在编译资源清单...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation. All rights reserved.
正在链接...
LINK : 没有找到 e:\myvc\AudRating0\Debug\AudRating0.exe 或上一个增量链接没有生成它;正在执行完全链接
AudRating0View.obj : error LNK2001: 无法解析的外部符号 "struct audi_param g_audi_param" (?g_audi_param@@3Uaudi_param@@A)
e:\myvc\AudRating0\Debug\AudRating0.exe : fatal error LNK1120: 1 个无法解析的外部命令
生成日志保存在“file://e:\myvc\AudRating0\AudRating0\Debug\BuildLog.htm”
AudRating0 - 2 个错误,0 个警告
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

大家帮忙看一下,分一定会给!
...全文
2459 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
梅文海 2008-12-22
  • 打赏
  • 举报
回复
看到你的错误提示,我一般这样用全局变量,你可以试试:

在 .h 文件中声明:
extern int g_i;

在 .cpp 文件中定义:
int g_i=0;

以后就可以直接用 g_i 了

我就写这么多了,你看看对你有没有帮助
xbottle 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wiowei 的回复:]
audi_param g_audi_param; 本身是全局变量了,为何用static限制?

以下三步试下:
1 把你的结构体定义 struct audi_param{...};放在a.h
2 把你的结构体变量 struct audi_param g_audi_param; 放在a.cpp中作为全局变量
3 在b.cpp中用extern struct audi_param g_audi_param; 调用
[/Quote]

谢谢,用你这样的方法好了。
但是我有一些不明白:
好像是一定要放在cpp文件中,而且不能用static定义struct audi_param g_audi_param,这是为什么呢?
wiowei 2008-12-19
  • 打赏
  • 举报
回复
audi_param g_audi_param; 本身是全局变量了,为何用static限制?

以下三步试下:
1 把你的结构体定义 struct audi_param{...};放在a.h
2 把你的结构体变量 struct audi_param g_audi_param; 放在a.cpp中作为全局变量
3 在b.cpp中用extern struct audi_param g_audi_param; 调用
ken_scott 2008-12-18
  • 打赏
  • 举报
回复
不是很清楚了
好像有这么一说:
在第一文件中声明:struct audi_param;
在另一个文件中如下(还是叫声明么?)
extern struct audi_param ;
audi_param g_audi_param ;
分成两步了,呵呵
真的不清楚了
不过 帮忙顶一下了
yueyinggufan 2008-12-18
  • 打赏
  • 举报
回复
用extern 方法楼上等朋友都讲了 LZ知道extern么,不太了解可以看看这个
http://www.crazycoder.cn/Tag/20549/Index.html
lann64 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xbottle 的回复:]
是在定义audi_param结构体的时候还是在声明的时候呢?
[/Quote]
cpp里声明的时候
xbottle 2008-12-18
  • 打赏
  • 举报
回复
是在定义audi_param结构体的时候还是在声明的时候呢?
张赐 2008-12-18
  • 打赏
  • 举报
回复
其实可以把结构的申明放在.h头文件里啊,使用比较方便
lann64 2008-12-18
  • 打赏
  • 举报
回复
extern "c" {
audi_param g_audi_param
}
需要声明是c方式命名的变量
xbottle 2008-12-18
  • 打赏
  • 举报
回复
那在
extern "c" {
...
}
里面要写什么呢?
xbottle 2008-12-18
  • 打赏
  • 举报
回复
是这个的extern audi_param g_audi_param;
“其中,g_audi_param是在另一个c文件中定义的,而在当前文件用的是“extern audi_param g_audi_param;”


应该不是这个问题。
lann64 2008-12-18
  • 打赏
  • 举报
回复
extern "c" {
...
}
pony_ml 2008-12-18
  • 打赏
  • 举报
回复
不太懂
是不是应该
struct audi_param;
extern audi_param g_audi_param;
帅得不敢出门 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xbottle 的回复:]
我将结构体的定义和声明都放在头文件a.h中了,static audi_param g_audi_param;
现在倒是编译过了,也生成成功。

但是有一个问题:
在a.h中相应的a.cpp中用g_audi_param中的数值,就有数值,
但是在另外一个b.cpp中使用(也就是上面的那段代码中),就会数值为0。
这是为什么呢??
[/Quote]
你a.cpp与b.cpp是如何使用a.h中的数据的?
如果是#include"a.h"然后使用g_audi_param,那么static限定了文件域,所以两处使用的是不同的实体.
xbottle 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jiww03 的回复:]
不知道楼主用了什么编译器,用VC6应该像你一开始说得那样就可以啊
比如:
有个结构体A a在1.cpp中定义了,注意要全局的,你要在2.cpp中用它,只需要extern A a;就行了,当然在2.cpp中一定要能找到结构体A的定义,只要在一个工程里面,不可能出现链接错误
[/Quote]
是visual studio 2008,而且是在一个工程中。
但是会在2.cpp中用的时候结构体中的值为0。

主要过程是这样:
在AudRating0.h中定义和声明了结构体static audi_param g_audi_param,而且AudRating0.cpp中对g_audi_param中的元素进行赋值,界面操作是在对话框a中输入数值,并计算。

然后要在后面AudRating0View.cpp中得到赋值后的g_audi_param,并进行运算,需要在文本界面显示出来。
artwl_cn 2008-12-18
  • 打赏
  • 举报
回复
不太清楚,帮顶下!
jiww03 2008-12-18
  • 打赏
  • 举报
回复
不知道楼主用了什么编译器,用VC6应该像你一开始说得那样就可以啊
比如:
有个结构体A a在1.cpp中定义了,注意要全局的,你要在2.cpp中用它,只需要extern A a;就行了,当然在2.cpp中一定要能找到结构体A的定义,只要在一个工程里面,不可能出现链接错误
xbottle 2008-12-18
  • 打赏
  • 举报
回复
是在a.cpp中的一个函数中赋值的
wiowei 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xbottle 的回复:]
我将结构体的定义和声明都放在头文件a.h中了,static audi_param g_audi_param;
现在倒是编译过了,也生成成功。

但是有一个问题:
在a.h中相应的a.cpp中用g_audi_param中的数值,就有数值,
但是在另外一个b.cpp中使用(也就是上面的那段代码中),就会数值为0。
这是为什么呢??

[/Quote]

g_audi_param是何处赋值的?初始化还是某函数体内?如果是某函数体内则有可能如你所说,因为你的obj文件的生成顺序不定
xbottle 2008-12-18
  • 打赏
  • 举报
回复
extern c没有用到,现在也可以编译和生成通过了,但就是会出现在另一个cpp文件中得不到结构体之前得到的数值了
加载更多回复(4)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧