使用结构解引用运算符在C中粘贴令牌

use*_*503 3 c structure token dereference c-preprocessor

我有一个关于'##'的问题,用于使用解除引用运算符进行预处理器粘贴.谁能告诉我为什么下面的代码不能编译?

typedef struct
{
    char data;
} MY_STRUCT;

MY_STRUCT  My_Instance;
MY_STRUCT* My_PInstance;

#if 1
#define GET_MEMBER(membername)         (My_PInstance->##membername)
#else
#define GET_MEMBER(membername)         (My_Instance.##membername)
#endif
Run Code Online (Sandbox Code Playgroud)

然后我打电话给:

char value = GET_MEMBER(data);  // Where My_PInstance is properly instantiated.
Run Code Online (Sandbox Code Playgroud)

我收到编译错误.

error: pasting "->" and "data" does not give a valid preprocessing token
Run Code Online (Sandbox Code Playgroud)

Chu*_*ang 6

你不需要粘贴.做就是了(My_Pinstance->membername)

'##'应将两个令牌粘贴到一个有效令牌中.但是 ->foo无效的令牌.(例如foo)