// 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
若是重复定义了,那么上面的语句不起作用了,对不对?

解决方案 »

  1.   

    extern BOOL m_bSerialPortOpened;
    extern CSerialPort m_SerialPort; 
    //看着头晕,你的这两句最好放在cpp文件中,不要放头文件中
      

  2.   

    #if _MSC_VER >  1000
    #pragma once
    #endif // _MSC_VER >  1000 这些是防止头文件重包含的,不是防止变量重定义的
      

  3.   

    要注意变量名不要相同,
    如果是调用别的cpp文件里的全局变量,
    当然要加extern,
    不加的话就视为你又重新定义了一个变量,
    别的cpp文件里如果有相同的,
    就会报错啦.
      

  4.   

    两个变量是
    extern BOOL m_bSerialPortOpened;//
    extern CSerialPort m_SerialPort;
      

  5.   

    但是我把以下两个放入类,作为
    PUBLIC:
    BOOL   m_bSerialPortOpened;//
      CSerialPort   m_SerialPort;
    就对了,这样有点神秘, 
    C++PRIMER里面说,头文件里只能声明,不能定义,但是类是个例外,可以定义类。
      

  6.   

    首先你得看二楼的解释然后extern 表示变量是在别的文件中定义的,在这个文件要使用这个变量(全局变量)比如在CSeriaPort.cpp文件中定义了变量
    BOOL   bSerialPortOpened;  //全局变量
    你想在CSerialPortTestDlg.cpp中使用这个变量,通过extern BOOL   bSerialPortOpened;就可以使用了//extern   BOOL   m_bSerialPortOpened;  
    //extern   CSerialPort   m_SerialPort;  //看你的写法,这两个是不是成员变量啊,要是成员变量的话,
                                                    就不能通过extern来给外部提供服务啊
      

  7.   

    定义类的时候,并没有用这个类去定义对象,就算这个类里面定义了成员变量,但是因为类对象不存在,自然没有空间重分配的问题。
    而直接定义变量就面临了空间分配的问题,两者当然不同了。前面加的那段,可以防止类重定义,但不能防止全局变量重定义的主要原因是不同的cpp都直接或间接包含了这个头文件,所以才会在两份obj里面出现重定义了,如果只有一个cpp包含也是没事的,不过一般不要这么写。
      

  8.   


    既然下面这些是防止头文件重包含的,不是防止变量重定义的
    #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_
      

  9.   

    纠正2楼的:
    #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编译器的版本
      

  10.   

    LZ应该去了解一下编译器编译文件的过程,虽然那个#ifdef-#define-#endif和#pragma once确实都是编译一次的意思,但只是针对一个cpp编译过来而言。1、编译器不会直接去编译.h文件,它只会编译.cpp文件,再根据.cpp所#include的.h将相应的.h文件也编译一次。
    2、一般来说是有几个.cpp就会生成几个中间文件.obj,各个.cpp的编译相对独立,不相互干扰,前一个.cpp所涉及的宏定义也对后一份也无效。基于以上两点原因,实际上#ifdef-#define-#endif和#pragma once仅仅是对编译同一份.cpp才起作用,用来防止在编译时就出现重定义错误;
    而对于不同的.cpp,实际上.h文件还是被编译了多次,这样一来在.h里面定义全局变量,自然会出现在两份.obj里面,这样链接就成了问题。
    而为什么两份类定义出现在.obj里面会没事呢?实际上类定义仅仅是指明内存的分配方式而已,个人推测可能其根本不存在于.obj之中,原因如下:
    在两个.cpp中定义两个名称相同的类,但其成员完全不同,并用此类定义两个局部对象,你会发现你可以成功通过编译。这个测试应该很能说明问题了……