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”和“++”不会给出有效的预处理 token ”
是否不允许粘贴`->'或'.' ?
最佳答案
It is giving me error: "pasting "a" and "++" does not give a valid preprocessing token"
这是对的。而且 C 不允许这样使用标记粘贴运算符。
看起来您想要生成以下形式的表达式
ms->name++
请注意,它由四个标记组成:ms
、->
、name
和 ++
。如果执行标记粘贴操作时,与 name
对应的宏参数实际上具有标识符的形式,例如 Mark
,那么结果将是单个标记 ->Mark
(在另外两个之间)。 ->Mark
不是有效 token 。
尽管空格通常用于分隔标记,但大多数标记之间不需要空格。另一方面, token 之间始终允许,因此您始终可以像这样编写上面的表达式:
ms -> name ++
或者像这样:
ms->name ++
或者像这样:
ms /* look, Ma, a comment! */
->name
++
据我所知,您的宏完全不需要粘贴 token 。只需删除 ##
。
关于c - C 中的 ## 运算符未按预期粘贴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56550127/