【问题标题】:How to declare the function as global using C++?如何使用 C++ 将函数声明为全局函数?
【发布时间】:2012-11-07 12:17:14
【问题描述】:

我在 Visual Studio 中使用 MFC。 这是函数StartClient,在cpp文件中定义,在.h文件中声明为

        protected:
      bool StartClient();     // in Client.h file 

          bool CClientSocketDlg::StartClient()      //in Client.cpp file
          {
            CString strServer;
        m_ctlIPAddress.GetWindowText( strServer );
            ------
            -----
            return bSuccess; 
          }

我也声明了这个

          extern CClientSocketDlg StartClient();  // in global.h

我想在另一个 xyz.cpp 文件中调用 StartClient() 函数。这就是为什么我将这个函数声明为全局的。但它不起作用。

这给出了错误:

错误 LNK2001:无法解析的外部符号“class CClientSocketDlg __cdecl StartClient(void)”(?StartClient@@YA?AVCClientSocketDlg@@XZ)

请指导我解决该错误。谢谢

【问题讨论】:

  • 您的第一个代码 sn-p 没有意义。第一行来自 .h 文件中的类定义,其余来自 .cpp 文件中的方法定义?如果有,请说出来。
  • 你的问题并不是关于声明一个全局函数,你似乎做得对。您得到的错误是您没有正确定义函数。要定义您的全局函数,请在您的 cpp 文件中写入 CClientSocketDlg StartClient() { ... }。不幸的是,我认为真正的问题是您的问题是要求您实际上并不想要的东西。所以也许你应该解释真正的问题是什么并寻求解决方案。再贴一些代码,你的代码看起来很混乱,但是没有看到真正的代码很难解决这个问题。
  • 我在问题中添加了一些细节
  • 这不是一个全局函数,它是一个成员函数。

标签: c++ visual-studio-2010 mfc


【解决方案1】:

声明

extern CClientSocketDlg StartClient();

告诉编译器StartClient 是一个独立函数,它不接受任何参数并返回CClientSocketDlg 对象的副本。

定义

bool CClientSocketDlg::StartClient() { ... }

告诉编译器类 CClientSocketDlg 有一个名为 StartClient 的成员函数,它不接受任何参数并返回 bool

这两个不一样。

如果出现错误,您似乎调用的是独立函数,而不是成员函数,并且它只是声明而不是定义(即没有该功能的实现)。如果你打算从 class 中调用StartClient,你应该声明一个对象并调用对象中的函数:

CClientSocketDlg dlg;
dlg.StartClient();

如果您要调用独立的,则必须实现该功能。

【讨论】:

  • 该功能已经实现。我只是想在其他一些 cpp 文件中使用该功能
  • @Nabeel 然后你不能用那个文件正确构建。是否包含在项目中?
  • 我编辑了这个问题。我希望这是您需要的所有信息
【解决方案2】:

您可以使用范围解析运算符来访问 C++ 中的全局函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2014-01-17
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多