C / C++ 预处理器从名称创建标头

C / C++ Preprocessor make header from name

本文关键字:创建 C++ 预处理 处理器      更新时间:2023-10-16

file Base.h

class Base {
}

文件 A.h

class A : public Base {
}

文件 B.h

class B : public Base {
}

文件 C.h

#define D_CLASS A

文件 C.cpp

#include "c.h"
#include D_CLASS##.h          // <--- how to make the header from class name?
Base * pBase = new D_CLASS() ;

这样做的动机...
支持不同操作系统的系统,每个操作系统都有头文件,告诉构建器要创建的类的名称,以便提供某些功能。
当用户添加它的新操作系统时,他还需要使用该功能定义他的特定类名。

你可以这样做:

#define PP_ADD_HDR_SUFFIX(x) PP_ADD_HDR_SUFFIX_IMPL(x)
#define PP_ADD_HDR_SUFFIX_IMPL(x) x.h
#define PP_QUOTE(x) PP_QUOTE_IMPL(x)
#define PP_QUOTE_IMPL(x) # x
#define CLASS_HEADER_NAME(name) PP_QUOTE(PP_ADD_HDR_SUFFIX(name))
#include "C.h"
#include CLASS_HEADER_NAME(D_CLASS)
Base * pBase = new D_CLASS();

它基本上扩展到这个:

#include #D_CLASS.h

第二个)"#"是创建一个字符串文字(文件名两边的引号),实际上不需要标记粘贴,只需要宏扩展。

但是,正如其他人所提到的,您最好有一个很好的用例。

过去,当我想支持"可配置"头文件(类的可配置介词/命名空间)时,我就是这样做的。据我所知,最后它看起来很乱:)。


同样,如果您想"预处理"系统标头(如#include <my_name.h>),您可以执行以下操作:

#define CLASS_NAME my_name
#define CLASS_SYSTEM_HEADER_NAME(name) CLASS_SYSTEM_HEADER_NAME_IMPL(name)
#define CLASS_SYSTEM_HEADER_NAME_IMPL(name) <name.h>
#include CLASS_HEADER_NAME(CLASS_NAME)