用于构建 class 函数的预处理器宏连接

Pre-processor macro concatenation to build class function

我需要一个 POD 配置结构数组,其中包含指向某些长名称 class 中的静态函数的指针,例如

typedef void (*MyFn)();

struct MyData {
    MyFn myFn;
    ...
};

...
struct MyData const configArr[] = {
    { ... },
    ...
};

要使用的函数看起来像void AClass::AnotherClass::YetAnotherClass::someFn();

我看到三个选项:

  1. configArr 成为 AClass::AnotheClass::YetAnotherClass 的成员,
  2. 在配置中使用全名。我也不喜欢他们,
  3. 我尝试了通常的两级预处理器连接,它抱怨说:

    'pasting "::" and "xxx" does not give a valid preprocessing token'.

我想出的最好的办法是为 conf 中使用的所有函数设置一些通用前缀。

即:AClass::...::prefSomeFn();并使用 'AClass::...::pref' 和 'SomeFn' 的连接它有效,但它仍然看起来太丑了。

有没有更好的出路?

'pasting "::" and "xxx" does not give a valid preprocessing token'.

那是因为它们 独立的标记;您不需要粘贴它们,只需将它们放在扩展中相邻即可:

struct ClassWithALongName { int i; };
#define X(MemberId) &ClassWithALongName::MemberId
auto ptr = X(i);