// SerialPortTestDlg.h : header file
//#if !defined(AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_)
#define AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include"SerialPort.h"
extern BOOL m_bSerialPortOpened;//
extern CSerialPort m_SerialPort;
/////////////////////////////////////////////////////////////////////////////
// CSerialPortTestDlg dialogclass CSerialPortTestDlg : public CDialog
{
// Construction
public:
CSerialPortTestDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CSerialPortTestDlg)
enum { IDD = IDD_SERIALPORTTEST_DIALOG };
CComboBoxEx m_ctrlComPort;
CString m_strEditReceiveMsg;
CString m_strEditSendMsg;
//}}AFX_DATA // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSerialPortTestDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected:
HICON m_hIcon; // Generated message map functions
//{{AFX_MSG(CSerialPortTestDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_)
请问,我在此头文件中,定义的两个变量,只有前面加上EXTERN才对,去掉后就出错,说是已经定义了在.obj文件中,我 想有
#if !defined(AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_)
#define AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
若是重复定义了,那么上面的语句不起作用了,对不对?
//#if !defined(AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_)
#define AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include"SerialPort.h"
extern BOOL m_bSerialPortOpened;//
extern CSerialPort m_SerialPort;
/////////////////////////////////////////////////////////////////////////////
// CSerialPortTestDlg dialogclass CSerialPortTestDlg : public CDialog
{
// Construction
public:
CSerialPortTestDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CSerialPortTestDlg)
enum { IDD = IDD_SERIALPORTTEST_DIALOG };
CComboBoxEx m_ctrlComPort;
CString m_strEditReceiveMsg;
CString m_strEditSendMsg;
//}}AFX_DATA // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSerialPortTestDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected:
HICON m_hIcon; // Generated message map functions
//{{AFX_MSG(CSerialPortTestDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_)
请问,我在此头文件中,定义的两个变量,只有前面加上EXTERN才对,去掉后就出错,说是已经定义了在.obj文件中,我 想有
#if !defined(AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_)
#define AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
若是重复定义了,那么上面的语句不起作用了,对不对?
解决方案 »
- 求教一程序算法说明的解析,急
- 高分问!!
- 关于IPicture在对话框上应用的问题
- 小妹有一急待解决的问题.在线等!
- 怎样让class在classview中显示出来
- 用 VC 编写了一个程序(纯SDK方式),现在把代码放去没有 VC++ 工具的计算机上编译(使用 cl 命令)。应该怎样做?
- CopyFile函数如何拷贝某一目录的所有文件
- 关于用Installshield制作安装程序的问题??
- 急!!怎么也找不到支持-40参数的RC.EXE,好心人给我发一份吧!([email protected])
- 使用Neo SDK的程序,从VS6.0移植到VS 2008后,刻录cd的速度变慢了两三倍,疑惑不解,请教大家,
- 动态连接库资源问题
- ◇◆◇ 我来散10分,第五个人进来后结贴 ◇◆◇
extern CSerialPort m_SerialPort; //看着头晕,你的这两句最好放在cpp文件中,不要放头文件中
#pragma once
#endif // _MSC_VER > 1000 这些是防止头文件重包含的,不是防止变量重定义的
如果是调用别的cpp文件里的全局变量,
当然要加extern,
不加的话就视为你又重新定义了一个变量,
别的cpp文件里如果有相同的,
就会报错啦.
extern BOOL m_bSerialPortOpened;//
extern CSerialPort m_SerialPort;
PUBLIC:
BOOL m_bSerialPortOpened;//
CSerialPort m_SerialPort;
就对了,这样有点神秘,
C++PRIMER里面说,头文件里只能声明,不能定义,但是类是个例外,可以定义类。
BOOL bSerialPortOpened; //全局变量
你想在CSerialPortTestDlg.cpp中使用这个变量,通过extern BOOL bSerialPortOpened;就可以使用了//extern BOOL m_bSerialPortOpened;
//extern CSerialPort m_SerialPort; //看你的写法,这两个是不是成员变量啊,要是成员变量的话,
就不能通过extern来给外部提供服务啊
而直接定义变量就面临了空间分配的问题,两者当然不同了。前面加的那段,可以防止类重定义,但不能防止全局变量重定义的主要原因是不同的cpp都直接或间接包含了这个头文件,所以才会在两份obj里面出现重定义了,如果只有一个cpp包含也是没事的,不过一般不要这么写。
既然下面这些是防止头文件重包含的,不是防止变量重定义的
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
那么下面的语句是不是多此一举呢?
#if !defined(AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_)
#define AFX_SERIALPORTTESTDLG_H__C6535AFE_461B_4EBE_955C_2C646720A670__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
这是微软的预编译控制。在_MSC_VER较小时,它对一些东西的支持与新版不同
_MSC_VER分解如下:MS:Microsoft(微软)的简写C:MSC就是Microsoft出的C编译器。VER:Version(版本)的简写。
哪些版本_MSC_VER>1000,
pragma once 又是什么意思?
vc++6.0的_MSC_VER = 1200至于哪些>1000, 我也不太清楚,pragma once 是说此文件只编译一次.全部加在一起就是:Microsoft的C编译器的版本
2、一般来说是有几个.cpp就会生成几个中间文件.obj,各个.cpp的编译相对独立,不相互干扰,前一个.cpp所涉及的宏定义也对后一份也无效。基于以上两点原因,实际上#ifdef-#define-#endif和#pragma once仅仅是对编译同一份.cpp才起作用,用来防止在编译时就出现重定义错误;
而对于不同的.cpp,实际上.h文件还是被编译了多次,这样一来在.h里面定义全局变量,自然会出现在两份.obj里面,这样链接就成了问题。
而为什么两份类定义出现在.obj里面会没事呢?实际上类定义仅仅是指明内存的分配方式而已,个人推测可能其根本不存在于.obj之中,原因如下:
在两个.cpp中定义两个名称相同的类,但其成员完全不同,并用此类定义两个局部对象,你会发现你可以成功通过编译。这个测试应该很能说明问题了……