Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/C++预处理器从名称中生成头_C++_C Preprocessor - Fatal编程技术网

C/C++预处理器从名称中生成头

C/C++预处理器从名称中生成头,c++,c-preprocessor,C++,C Preprocessor,文件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()

文件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),可以执行以下操作:

#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)

为什么这里有c标签?不要这样做。使用你的工具而不是与之对抗。键入include D_CLASS.h是否比键入include a.h容易得多?请告诉我这个用例,因为你的用户名是教我-生命中的一个教训-不要为你自己的背部创建一个棒你真的尝试过吗?除了可能在非标准预处理器(如MSVC::error:粘贴ctype和)上,它不起作用。没有给出有效的预处理标记。我在MSVC中尝试过它。但是我会在不同的编译器中尝试,也许我以前做的有点不同,因为我知道它在大多数编译器中都能工作,我会尝试查找它。更新版本至少在我测试的MSVC和GCC中工作。事实上,它实际上更简单,根本不需要标记粘贴:还测试了它与coliru exampleyes一起工作,重点是标记粘贴不仅是不必要的,而且是非法的;文件路径通常不是有效的令牌。第一个不适用于clang,第二个适用于系统头,我需要它:include my_header.h