C++预处理器是如何工作的
How does C++ Preprocessors work?
我目前正在研究开源C++项目,以了解有关C++的更多信息。我正在研究的项目之一位于:
https://github.com/Myzilla-Web-Resources/OpenBlox/
我理解大部分源代码,但我不明白的是他是如何使用预处理器来声明C++类的。
例如,
static_init.h
#define DECLARE_STATIC_INIT(ClassName)
static void static_init_func();
static OpenBlox::static_init_helper ClassName##_static_init_helper
namespace OpenBlox{
class static_init_helper{
public:
static_init_helper(init_func_type f){
static_init::instance().add_init_func(f);
}
};
实例.h
#define DECLARE_CLASS(Class_Name)
virtual Instance* cloneImpl();
virtual QString getClassName();
virtual int wrap_lua(lua_State* L);
DECLARE_STATIC_INIT(Class_Name);
protected:
static QString ClassName;
static QString LuaClassName
帧.h
namespace ob_instance{
class Frame: public GuiObject{
public:
Frame();
virtual ~Frame();
virtual void render();
DECLARE_CLASS(Frame);
};
}
#endif
请注意,Frame.h继承了Instance.h的所有函数/处理器。有人能向我解释一下这是怎么回事吗?
预处理器只是一个文本查找和替换,因此在您显示的Frame
定义中,预处理器首先看到DECLARE_CLASS(Frame)
,并将其替换为DECLARE_CLASS
宏的内容,成为
namespace ob_instance{
class Frame: public GuiObject{
public:
Frame();
virtual ~Frame();
virtual void render();
virtual Instance* cloneImpl();
virtual QString getClassName();
virtual int wrap_lua(lua_State* L);
DECLARE_STATIC_INIT(Frame);
protected:
static QString ClassName;
static QString LuaClassName;
};
}
(我清理了格式,实际上整个替换文本都在一行上(。
然后,它备份到插入的文本之前,再次开始通读,并看到DECLARE_STATIC_INIT(Frame)
并替换它:
namespace ob_instance{
class Frame: public GuiObject{
public:
Frame();
virtual ~Frame();
virtual void render();
virtual Instance* cloneImpl();
virtual QString getClassName();
virtual int wrap_lua(lua_State* L);
static void static_init_func();
static OpenBlox::static_init_helper Frame_static_init_helper;
protected:
static QString ClassName;
static QString LuaClassName;
};
}
(##
是令牌级联运算符(
为您提供最终的Frame
类定义。
正如Chris Beck在评论中提到的,您可以使用-E
标志来gcc或clang,让编译器输出预处理的文件,而不是编译它。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个