为什么这个宏不能扩展?

问题描述 投票:0回答:1

这是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)根本不扩展?

我不知道的有关连接令牌##的东西有什么特别之处吗?

我正在使用GCC 9.3和CMake 3.16.5

c++ c-preprocessor
1个回答
1
投票

如果跟随扩展,您会注意到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)

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

© www.soinside.com 2019 - 2024. All rights reserved.