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

标签 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”和“++”不会给出有效的预处理 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/

相关文章:

arrays - C 结构体可以包含指向其他结构体数组的指针(具有不同的长度)

c - execve() 和 execvp() 忽略第一个参数

macros - 在 Common Lisp 中,为什么宏 OR 使用 gensym 而不是 AND?

java - 如何在 Android 中使用 WebView 获取身份验证 token ?

c++ - 窗口 GDI : horizontal/vertical DPI

c++ - 为什么取消引用称为取消引用的指针?

用于将可读方程式转换为相应代码的 C++ 宏

macros - 评估宏形式的参数

iphone - 推送通知设备 token ?

ruby-on-rails - 领英 : Exchange JSAPI token to REST's OAuth token