C预处理令牌连接

时间:2016-03-02 02:30:09

标签: c c-preprocessor

如何使用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

2 个答案:

答案 0 :(得分:1)

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

你有:

#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; }

修复了proprocessor错误但会导致与返回类型相关的错误。如果在返回类型中有auto,则需要使用尾随返回类型。

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

这是一个应该有效的固定宏:

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

答案 1 :(得分:-2)

typedef 语法:

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

'Book'替换为整个struct定义。 ;在{}内有效。