C/C++ 带参数的宏
C/C++ macros with parameters
我对在 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"); \
} \
}
我能够推断出双## 意味着它将重复文本参数,但我不明白以下部分:
"vk" #entrypoint
前缀后有一个space和一个#而不是##。
##
是粘贴运算符。它确保编译器认为左侧和右侧只是一个标记。如果你写 GET_INSTANCE_PROC_ADDR(foo, bar)
,那么 demo->fp##entrypoint
就变成了 demo->fpbar
.
#
获取宏参数的内容作为字符串。如果写GET_INSTANCE_PROC_ADDR(foo, bar)
,那么#entrypoint
就是"bar"
.
在 C 和 C++ 中,将两个字符串文字并排放置是合法的,编译器会将它们连接起来:"this" "is" "valid"
与 "thisisvalid"
相同。
我对在 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"); \
} \
}
我能够推断出双## 意味着它将重复文本参数,但我不明白以下部分:
"vk" #entrypoint
前缀后有一个space和一个#而不是##。
##
是粘贴运算符。它确保编译器认为左侧和右侧只是一个标记。如果你写 GET_INSTANCE_PROC_ADDR(foo, bar)
,那么 demo->fp##entrypoint
就变成了 demo->fpbar
.
#
获取宏参数的内容作为字符串。如果写GET_INSTANCE_PROC_ADDR(foo, bar)
,那么#entrypoint
就是"bar"
.
在 C 和 C++ 中,将两个字符串文字并排放置是合法的,编译器会将它们连接起来:"this" "is" "valid"
与 "thisisvalid"
相同。