关于enum,struct在头文件中声明问题

buleideli 2008-02-18 10:56:22
mfc中,
自己声明了一些enum和struct结构,打算在程序中的几个文件中用,本来我的做法是:在这些enum和struct结构写在一个独立的a.h,a.cpp文件中,然后在每个要用到它的地方包含该头文件,但是报错说那些在a文件中的类型在其它文件中不能识别,于是将enum和struct结构重新写在每个用到的文件的class声明之外,报错说重定义。



最后干脆不用包含a文件,直接将enum和struct结构写在每个用到的class的class声明之内,没有错误。

难道就没办法将程序中普遍用到的数据类型写入一个头文件,然后其它文件包含它就行的方法吗????
...全文
3370 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xstong1982 2008-02-19
  • 打赏
  • 举报
回复
//a.h中
typedef enum{A,B,C}num;
typedef struct
{
num n1;
}data;


//然后在其它文件中定义data型变量

//其它用到的文件中,例如file1.cpp中
#include"a.h"

class file1
{
public:
data d1;//错误,没定义
......
};
=================================================
我这里试下来vc和.net都能编译通过的,是不是有其它问题?
buleideli 2008-02-19
  • 打赏
  • 举报
回复
你们说得都没错

但我现在问题是:

/////////////////////////////////////////////////////////

这样能够编译连接通过。
请注意这里的gameDoc.h,
#include "test.h"只能放在这里,而不能放在gameDoc.cpp文件,否则出错,说d2未定义。还发现#include "test.h"加在gameView.h,dlg1.h的类声明前也没错。

是否可的出结论:
只要把#include "test.h"加在将要使用文件的.h肯定编译连接通过呢?

如果是这样,我就不明白了,对于gameDoc,#include "test.h"为什么只能放在.h文件,

更一般情况,例如:
//////////
情况一:
//a.cpp
#include "test.h"
#include "a.h"
//a.h
.......

//////
情况二:
//a.cpp
#include "a.h"
//a.h
#include "test.h"
.......

以上两种情况不是一样的吗?
a.cpp都可以转化为
//a.cpp

test.h里的内容
a.h里的内容
......
、、、、、、、、、、、、、、、、
jingzhongrong 2008-02-19
  • 打赏
  • 举报
回复

//a.cpp
#include "a.h"
...

//a.h
#include "common.h"
...

//common.h
...
datoucaicai 2008-02-18
  • 打赏
  • 举报
回复
声明在stdafx.h应该没问题吧,我以前这样做过啊
ouyh12345 2008-02-18
  • 打赏
  • 举报
回复
头文件里只声明枚举和结构
是否还定义了变量?
ouyh12345 2008-02-18
  • 打赏
  • 举报
回复
//GeneralDef.h

enum RecordState
{
State_Invalid,
State_Ready,
State_Recording,
};

typedef struct tagIdNameDescription{
int id; ///< 错误号
const char * name; ///<错误名
const char * description; ///< 错误描述
}IdNameDescription;
buleideli 2008-02-18
  • 打赏
  • 举报
回复
不需要,a.cpp中只是#include"stdafx.h"和#include"a.h",但是照我最后没错误的那样做,不同class的相同名称的struct,enum不能互相赋值,因为是在不同class声明,作用域不同,这样只能用一个头文件包含了。

可以的话怎么做????
ouyh12345 2008-02-18
  • 打赏
  • 举报
回复
可以的

在这些enum和struct结构写在一个独立的a.h,a.cpp文件中???
还需要放在a.cpp中???
jingzhongrong 2008-02-18
  • 打赏
  • 举报
回复
首先你在头文件中的类声明用到了data这个struct,所以是要包含test.h的
如果没有在头文件中包含就会提示未定义
duanhuicen 2008-02-18
  • 打赏
  • 举报
回复
把结构体、枚举类型定义都声明在一个a.h中,然后在stdafx.h文件做一下包含,这样在整个工程的任何地方都可以引用了。
buleideli 2008-02-18
  • 打赏
  • 举报
回复
ding
buleideli 2008-02-18
  • 打赏
  • 举报
回复
buleideli 2008-02-18
  • 打赏
  • 举报
回复
自己写了个简单的

//test.h
#ifndef TEST_H
#define TEST_H
#pragma once

enum num{A,B,C};

typedef struct
{
num n1;
}data;

#endif
、、、、、、、、、、、、、、、、、、、、、、、、、、、、
//test.cpp
#include "stdafx.h"
#include "test.h"
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
// gameView.cpp
#include "test.h"
#include "gameView.h"
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
// gameView.h
.....
class CGameView : public CFormView
{
.......
data d1;
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
// gameDoc.h
#include "test.h"
.....
class CGameDoc : public CDocument
{
.....
data d2;
}
、、、、、、、、、、、、、、、、、、、
//gameDoc.cpp
//不作改动
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
// dlg1 dialog
// dlg1.h
class dlg1 : public CDialog
{
......
data d3;
}
、、、、、、、、、、、、、、、、、、、、、、
// dlg1.cpp

#include "test.h"

#include "dlg1.h"
/////////////////////////////////////////////////////////

这样能够编译连接通过。
请注意这里的gameDoc.h,
#include "test.h"只能放在这里,而不能放在gameDoc.cpp文件,否则出错,说d2未定义。还发现#include "test.h"加在gameView.h,dlg1.h的类声明前也没错。

是否可的出结论:
只要把#include "test.h"加在将要使用文件的.h肯定编译连接通过呢?

如果是这样,我就不明白了,对于gameDoc,#include "test.h"为什么只能放在.h文件,

更一般情况,例如:
//////////
情况一:
//a.cpp
#include "test.h"
#include "a.h"
//a.h
.......

//////
情况二:
//a.cpp
#include "a.h"
//a.h
#include "test.h"
.......

以上两种情况不是一样的吗?
a.cpp都可以转化为
//a.cpp

test.h里的内容
a.h里的内容
......
、、、、、、、、、、、、、、、、
buleideli 2008-02-18
  • 打赏
  • 举报
回复 1
to ouyh12345 :

头文件里只声明枚举和结构
是否还定义了变量?

/////////////////////////
我是写成这种形式的,只声明这种类型

//a.h中
typedef enum{A,B,C}num;
typedef struct
{
num n1;
}data;


//然后在其它文件中定义data型变量

//其它用到的文件中,例如file1.cpp中
#include"a.h"

class file1
{
public:
data d1;//错误,没定义
......
};


16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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