C中的##运算符未按预期粘贴

时间:2019-06-11 18:53:59

标签: c macros token

struct ms {
        uint64_t a;
        uint64_t b;
        uint64_t c;
        uint64_t d;
};
#define MS_INC(ms, name) ms->##name++

...
struct ms m;
MS_INC(&m, a);

这给我一个错误:“粘贴“ a”和“ ++”没有给出有效的预处理令牌”

是否不允许粘贴“->”或“。” ?

1 个答案:

答案 0 :(得分:2)

  

这给我一个错误:“粘贴“ a”和“ ++”没有给出有效的预处理令牌”

是的。而且C不允许这样使用令牌粘贴操作符。

您似乎想生成以下形式的表达式

allOf

请注意,它由四个令牌组成:ms->name++ ms->name。如果您执行令牌粘贴操作,其中与++对应的宏参数实际上具有标识符形式,例如name,那么结果将是单个令牌Mark(介于另外两个)。 ->Mark不是有效的令牌。

尽管空格通常会分离标记,但大多数标记之间并不需要。另一方面,令牌之间总是 allowed ,因此您可以这样编写上面的表达式,而不是:

->Mark

或类似这样:

ms -> name ++

或类似这样:

ms->name ++

据我所知,您的宏绝对不需要令牌粘贴。只需移除ms /* look, Ma, a comment! */ ->name ++

相关问题