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" 相同。