C预处理令牌连接

C Preprocessing Token concatenation

如何使用 C 预处理自动生成以下代码模式(访问器)?

// Immutable accessor.
const auto& member1 () const {
  return _member1;  // private class member
}

// Mutable accessor.
auto& member1() {  
  return _member1;  // private class member
}

我尝试了以下但没有用...

#define EXPAND_ACCESSOR(item) constexpr const auto& ##item() const { return _##item; } \
                              constexpr auto& ##item() { return _##item; }


EXPAND_ACCESSOR(member1)  // didn't work

typedef 语法:

typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
 } Book;

'Book' 替换为之前的整个结构定义。 ;在 {} 内有效。

您可以使用宏来完成您正在尝试的事情。您的宏需要一些调整。 (我使用三行来帮助回答)

你有:

#define EXPAND_ACCESSOR(item) \
   constexpr const auto& ##item() const { return _##item; } \
   constexpr auto& ##item() { return _##item; }

宏有问题:

   constexpr const auto& ##item() const { return _##item; } \
                         ^^ Not appropriate.

我从 g++ 得到以下错误:

error: pasting "&" and "member1" does not give a valid preprocessing token

您只需要使用:

#define EXPAND_ACCESSOR(item) \
   constexpr const auto& item() const { return _##item; } \
   constexpr auto& item() { return _##item; }

这修复了处理器错误,但它会导致与 return 类型相关的错误。当 return 类型中有 auto 时,您需要使用尾随 return 类型。

constexpr 与非 const 成员函数一起使用是不合适的。当成员函数用 constexpr 限定时,它被假定为 const 成员函数。因此,您需要从该函数中删除 constexpr

这是一个应该可以工作的固定宏:

#define EXPAND_ACCESSOR(item) \
   constexpr const decltype( _ ## item) & item() const { return _ ## item; } \
   decltype( _ ## item) & item() { return _ ## item; }