c++在file.h和file.cpp中编写回调函数

c++ Writing callback function in file.h and file.cpp

本文关键字:file 写回 回调 函数 cpp c++      更新时间:2023-10-16

我需要编写一个回调函数,因为我将使用以下函数:

EnumChildWindows(windowHandle, EnumChildProc, 0);

其中第二个变量"EnumChildProc"需要是回调函数。

问题是在头文件和源文件中编写函数时遇到了困难。通常,当我编写布尔函数或任何其他类型时,我会首先以以下方式在标题中对其进行delcare:

bool myFunction(int var1);

如果前一个文件在.h文件中,我会在源文件中写以下代码:

bool file::myFunction (int var1)
{
  ///here would be my code
}

但通过回调函数,我尝试了以下操作,但没有成功:

在文件中。h:

BOOL CALLBACK EnumChildProc(HWND windowHandle, LPARAM lParam);

在文件.cpp:中

BOOL file::CALLBACK EnumChildProc(HWND windowHandle, LPARAM lParam)
{
   ///code goes here
}

它不起作用,因为我得到以下错误:

error: expected unqualified-id before '__attribute__'

错误指的是源代码中的以下行:

BOOL programLoop::CALLBACK EnumChildProc(HWND windowHandle, LPARAM lParam)

你知道我做错了什么吗?当我在头文件或源文件中声明回调函数时,我不知道我是否做错了什么。。。你们觉得怎么样?

CALLBACK只是一个宏,它将专门的Microsoft属性添加到函数声明中。仅在声明中使用它,而不是在使用函数的地方使用它。

EnumChildWindows的第二个参数被声明为WNDENUMPROC,它被声明为

    typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);

所以你要声明你的回调函数为

    BOOL CALLBACK myFunction (HWND w, LPARAM var1);

    BOOL CALLBACK file::myFunction (HWND w, LPARAM var1);

作用域限定符::始终位于作用域名称(在本例中为file)和从属名称(myFunction)之间

如果file是一个名称空间,那么您已经设置好了;如果file是一个类,请记住在该类中也声明myFunction static。在某些情况下,您可能还需要extern

当您枚举子窗口时

    HWND hwparent=/* handle of the window you want to enumerate */;
    LPARAM var1=/* the value you want to pass in*/;
    EnumChildWindows (hwParent, myFunction, var1);

Windows为每个窗口调用您的函数,传入w参数,这样您就知道它是哪个窗口,var1是您的参数。


至于where:不需要在头文件中声明myFunction。很可能只有对EnumChildWindows的调用使用myFunction。它不会从任何其他文件调用。因此,只要myFunction出现在.cpp文件中对EnumChildWindows的调用之前,就可以了。

当然,如果file是一个类,那么静态成员函数myFunction必须在类声明中,该声明通常在某个头中。

使用该函数时,仅当调用该函数的位置不在file(类或命名空间)作用域中时,才需要添加file::

如果file是一个类,那么在定义myFunction时需要file::,但如果在另一个类成员函数中调用EnumChildWindows,则不需要file::

  // .h file
  class file 
  { 
   private:
   HWND m_hwParent;
   static HRESULT myFunction (HWND hw, LPARAM arg1); 
   public:
   HRESULT OnAllChildWindows (LPARAM arg1);
   // more stuff
  };
  // .cpp file 
  HRESULT file::myFunction (HWND hw, LPARAM arg1) 
  {
   // whatever this does
  }
  HRESULT file::OnAllChildWindows (LPARAM arg1)
  {
   EnumChildWindows (m_hwParent, myFunction, arg1);
  }

如果file是一个命名空间,那么如果您将所有代码封装在一个命名空间块中,则不需要file::

  namespace file {
      HRESULT myFunction (HWND hw, LPARAM arg1) 
      {
       // whatever this does
      }
      HRESULT OnAllChildWindows (HWND hwParent, LPARAM arg1)
      {
       EnumChildWindows (myFunction, arg1);
      }
   }

但如果你没有,或者是一个不同的范围:

  HRESULT someting_else::OnAllChildWindows (HWND hwParent, LPARAM arg1)
  {
   EnumChildWindows (hwParent, file::myFunction, arg1);
  }