gpt4 book ai didi

c++ - 为什么此宏没有扩展?

转载 作者:行者123 更新时间:2023-12-02 09:54:56 24 4
gpt4 key购买 nike

这是assets.cpp.i的预处理器输出:

#define CLASSNAME GAMEOBJECT
#define CLASSNAME_NORMAL GameObject
#define GAMEOBJECT_EXPANSION(FUNC) FUNC(std::vector<std::shared_ptr<Component>>, comps)




# 1 "/home/rubend/p/engine/libs/include/prefab.h" 1

#define prefab_h



#define PREFAB_VAR_ENUM_NAME(name) name ##_enum
#define PREFAB_VAR_ENUM_DIRTY(type,name) PREFAB_VAR_ENUM_NAME(name),


# 42 "/home/rubend/p/engine/libs/include/prefab.h"
#define _CLASSNAME_EXPANSION(classname,func) classname ## _EXPANSION(func)
#define CLASSNAME_EXPANSION(func) _CLASSNAME_EXPANSION(CLASSNAME,func)

template<class T>
class Prefab:public File{
private:
std::shared_ptr<T> ref;

protected:

enum DIRTY_ENUM{First, CLASSNAME_EXPANSION(PREFAB_VAR_ENUM_DIRTY) Last};

};

现在,为什么 CLASSNAME_EXPANSION(PREFAB_VAR_ENUM_DIRTY)根本不扩展?

我不知道的有关连接 token ##有什么特别的地方吗?

我正在使用GCC 9.3和CMake 3.16.5

回答

通过添加另一个宏对其进行了修复:
#define __CLASSNAME_EXPANSION(classname, func) classname ## _EXPANSION(func)
#define _CLASSNAME_EXPANSION(classname, func) __CLASSNAME_EXPANSION(classname,func)
#define CLASSNAME_EXPANSION(func) _CLASSNAME_EXPANSION(CLASSNAME,func)

更新12/4/20

@rici指出我应该将下划线放在最后,因为内部库宏首先使用下划线。

最佳答案

如果您进行扩展,则会注意到CLASSNAME_EXPANSION正在扩展-本身。

让我们逐步看一下发生了什么:

CLASSNAME_EXPANSION(PREFAB_VAR_ENUM_DIRTY)
-> _CLASSNAME_EXPANSION(CLASSNAME,PREFAB_VAR_ENUM_DIRTY)
-> CLASSNAME ## _EXPANSION(PREFAB_VAR_ENUM_DIRTY)
-> CLASSNAME_EXPANSION(PREFAB_VAR_ENUM_DIRTY)

由于此宏的名称与原始宏的名称相同(即它是一个嵌套名称),因此我们不会对其进行扩展。

关于c++ - 为什么此宏没有扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61000857/

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