gpt4 book ai didi

c++ - C++中令人困惑的宏定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:08 26 4
gpt4 key购买 nike

最近,我在阅读 B-Human 的一些代码时遇到了这个令人困惑的片段:

void enumInit(char* enums, const char** names, int numOfEnums);

#define ENUM(Enum, ...) \
enum Enum : unsigned char {__VA_ARGS__, numOf##Enum##s}; \
inline static const char* getName(Enum e) \
{ \
static char enums[] = #__VA_ARGS__; \
static const char* names[numOf##Enum##s]; \
static bool init = true; \
if(init) \
{ \
enumInit(enums, names, numOf##Enum##s); \
init = false; \
} \
return e >= numOf##Enum##s ? 0 : names[e]; \
}

我看不懂这个宏是怎么工作的,怎么会是宏定义中的函数定义呢?它是带有#pragma once 的单个 cpp 头文件。

最佳答案

void enumInit(char* enums, const char** names, int numOfEnums);

在您发布的代码中的任何地方都没有定义,所以严格来说我不知道​​它的作用。

#define ENUM(Enum, ...) \
enum Enum : unsigned char {__VA_ARGS__, numOf##Enum##s}; \

这定义了一个枚举,其中传递给宏的值作为“...”(谷歌“可变宏”)作为值,以及一个附加条目,其值为该宏中的元素数,其名称为串联“numOf”、Enum 的值(作为参数传递)和“s”。如果枚举包含 n 个其他值(从 0 开始),则最后一个值是具有值和位置 n 的条目。

inline static const char* getName(Enum e) \
{ \
static char enums[] = #__VA_ARGS__; \
static const char* names[numOf##Enum##s]; \
static bool init = true; \
if(init) \
{ \
enumInit(enums, names, numOf##Enum##s); \
init = false; \
} \
return e >= numOf##Enum##s ? 0 : names[e]; \
}

这会在调用宏的任何地方定义一个内联函数。它定义了一个静态数组,其中包含枚举条目 (enums[]) 的字符串化值及其名称 (names[...])。在第一个秋天,enumInit(...) 被调用。很可能,此函数用相应枚举值的名称填充 names 数组。为此,使用存储在 enums[] 中的字符串。要知道它究竟是如何工作的,我需要知道 enumInit 的定义。

编辑:为了更清楚地回答它怎么可能是宏定义中的函数定义? 您问题的一部分:宏本身只是粘贴在使用它的地方。函数定义被插入到任何被调用的地方,因此每次宏调用都会生成一个函数。

关于c++ - C++中令人困惑的宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24889743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com