这里C++的typedef和define如何理解?

为简单起见,我用伪代码示意如下:

namespace ns1{
    class nsc1
    {
    
    };
}

class gc2
{

};

typedef void (ns1::nsc1::*ClickHandler)(ns1::nsc1*,gc2*);
#define BTN_HANDLER(_SelObj) (ClickHandler)(&_SelObj)

1、typedef部分,定义的函数指针前面用ns1::nsc1修饰是什么目的?

2、#define部分,BTN_HANDLER定义为ClickHandler(&_SelObj),可是函数ClickHandler的参数是2个啊?这里为何只有一个?

代码运作良好,读起来这部分比较困难。请赐教!

 


1. 首先,ns1是C++的名称空间修饰,就是一个限定作用,可先忽略

typedef void (nsc1::*ClickHandler)(nsc1*,gc2*);

2. 其次,typedef是给后面的类型一个别名,例如

typedef int MyInt;           // 给int类型定义一个别名
typedef (*MyFunc)(int,int);  // 定义一个函数指针的别名

void test(int,int){

}
MyFunc f = &test; // 这样函数指针就可以被赋值,test函数的参数和返回值类型与MyFunc匹配

3. C++有成员函数,成员函数也是一种函数,当然我们也可以对它用typedef定义其函数指针的别名,例如

class Test{
  void echo(int){}
}

typedef (Test::*FnDump)(int); // 定义一个属于Test类的成员的函数指针,别名dumpMember
FnDump f = &Test::echo; // 于是类Test的成员函数echo,其指针可以被赋值给FnDump类型的实例。

但是怎么调用呢?echo是一个成员函数,隐藏了第一个指针this,需要这么调用

this->*f(10);

注意如果不加typedef,FnDump就会只是个变量:

 (Test::*FnDump)(int);        // FnDump是个成员函数指针变量
typedef (Test::*FnDump)(int); // FnDump是个成员函数指针的类型


4. 所以问题里的typedef,给类nsc1的成员函数定义了一个函数指针类型,类型别名是ClickHandler
nsc1里符合该函数指针参数类型和返回值类型的成员函数指针,都可以被赋值为ClickHandler的变量

下面的define遵守C/C++的宏定义规则,实际代码会被展开,看上去想解决的的是部分绑定的问题,但是做法不够现代,可以直接用这组现代的风格:

  1. [1] https://en.cppreference.com/w/cpp/language/pointer
  2. [2] https://en.cppreference.com/w/cpp/utility/functional/mem_fn
  3. [3] https://en.cppreference.com/w/cpp/utility/functional/bind

typedef 生成的是新类型。代码预编译之后使用的地方一样。

define 是宏定义,一对一替换,预编译之后将会被替换。

前者好用,后者易读。

宏定义看起来像是类型强转。

你似乎没有看清我的问题啊

补上:define部分应该是理解了,这里是一个强制类型转换,将宏BTN_HANDLER的参数_SelObj强制转换为typedef中定义的函数指针类型。

第一个问题仍然不明白,我试图将ClickHandler前面的ns1::nsc1::除掉,结果出错。

函数指针添加域说明是标准格式。

建议查看C++标准,typedef定义成员函数类型。我记得这是语法规定。

编译角度来解释不太好解释这个东西。

typedef 相当于自定义一个新的类型,并用这个类型进行声明变量,这个在c语言中多用于定义一个结构体的类型,

define 宏实际类似于给某个已经存在的类型起了一个别名

解释的非常清晰,感谢!