Macros C/C++;带参数的宏

Macros C/C++;带参数的宏,macros,c-preprocessor,Macros,C Preprocessor,我对在C宏中使用##和#表示怀疑。 我发现了这样的代码: #define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \ { \ demo->fp##entrypoint =

我对在C宏中使用##和#表示怀疑。 我发现了这样的代码:

 #define GET_INSTANCE_PROC_ADDR(inst, entrypoint)                               \
{                                                                          \
    demo->fp##entrypoint =                                                 \
        (PFN_vk##entrypoint)vkGetInstanceProcAddr(inst, "vk" #entrypoint); \
    if (demo->fp##entrypoint == NULL) {                                    \
        ERR_EXIT("vkGetInstanceProcAddr failed to find vk" #entrypoint,    \
                 "vkGetInstanceProcAddr Failure");                         \
    }                                                                      \
}
我能够推断出double##意味着它将重复文本参数,但我不理解以下部分:

 "vk" #entrypoint
前缀后面有一个空格,单个#而不是##。

##
是粘贴操作符。它确保编译器认为左侧和右侧只是一个标记。如果编写
GET\u INSTANCE\u PROC\u ADDR(foo,bar)
,则
demo->fp\35; entrypoint
将变为
demo->fpbar

#
以字符串形式获取宏参数的内容。如果您编写
GET\u INSTANCE\u PROC\u ADDR(foo,bar)
,那么
\entrypoint
就是
“bar”


<>在C和C++中,将两个字符串文字彼此相邻,编译器将连接它们:“代码>”,这个“有效”< /COD>与<代码>“TISISHOLLATION”。< /P>您查看生成的替换文本吗?你是怎么发现自己的?我想看到一个宏的结果是另一个线程的主题。我在代码块上尝试gcc-E,但它不起作用。这是一个关于绑定Java和Vulkan的项目,主要工具和专业知识是关于Java和3D的。此外,StackOverflow没有类似的问题/答案。
##
跳过任意两个参数的实际值。它不一定只产生一个标记。@zneak-回答得很好。奇怪的是,这类信息很难找到,人们怎么会认为这是一件显而易见的事情。这不明显,而且很难找到!谢谢