Macros C/C++;带参数的宏
我对在C宏中使用##和#表示怀疑。 我发现了这样的代码:Macros C/C++;带参数的宏,macros,c-preprocessor,Macros,C Preprocessor,我对在C宏中使用##和#表示怀疑。 我发现了这样的代码: #define GET_INSTANCE_PROC_ADDR(inst, entrypoint) \ { \ demo->fp##entrypoint =
#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-回答得很好。奇怪的是,这类信息很难找到,人们怎么会认为这是一件显而易见的事情。这不明显,而且很难找到!谢谢