Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++ 通过define指令指定类名。可能的_C++_Class_C Preprocessor - Fatal编程技术网

C++ 通过define指令指定类名。可能的

C++ 通过define指令指定类名。可能的,c++,class,c-preprocessor,C++,Class,C Preprocessor,我可以创建一个类并从外部源分配他的名字吗 例: 编辑:我的真实代码 (这样,在DUnit框架的XML输出中,我的测试名称是TestName,而不是DatabaseTest) 对。预处理在编译之前进行 您的编译器将基本上看到 class Clients { public: Clients(); }; Clients::Clients() { // } 但你为什么想要这个?你有没有试图解决一些潜在的问题?我相信有更好的方法。虽然绝对不推荐,但这是可能的。C(或C++)预处

我可以创建一个类并从外部源分配他的名字吗

例:

编辑:我的真实代码 (这样,在DUnit框架的XML输出中,我的测试名称是TestName,而不是DatabaseTest)


对。预处理在编译之前进行

您的编译器将基本上看到

class Clients
{
    public:
    Clients();
};

Clients::Clients()
{
    //
}

但你为什么想要这个?你有没有试图解决一些潜在的问题?我相信有更好的方法。

虽然绝对不推荐,但这是可能的。C(或C++)预处理器可以用指定的定义值替换任何名称,而不考虑其含义。毕竟,它们只是预处理器

假设您有这个头文件:

通用_类.h

class ClassName
{
    public:
    ClassName()
    {
        //
    }
};
您可以获得此类的多个实例,如下所示:

#define ClassName Server
#include "generic_class.h"
#undef ClassName

#define ClassName Clients
#include "generic_class.h"
#undef ClassName
请注意,不应将防护装置添加到标题中


这段代码当然很糟糕。

你至少应该在发布之前尝试一下——如果你这么做了,你可能会发现答案是肯定的,一般来说,你不应该这样做。事实上,这是行不通的。使用“ClassName”名称编译。@Stew实际上,它确实有效:不,它使用“Clients”名称编译:我正在尝试对我的单元测试进行泛化。我会用代码示例更新我的帖子。我会接受你的答案,很好的示例,但对我的案例不起作用。编译,但我的日志文件注册“CalpNeNeX”= /你能告诉我你是如何记录类名的,你在哪里做的?我不知道DUnit,但是可能是它自己直接读取类的名字,而不考虑C++预处理器正在做什么。毕竟,没有程序希望宏更改类的名称。您是否可以将类的名称记录在其构造函数中,从而忽略DUnit告诉您的内容?
class ClassName
{
    public:
    ClassName()
    {
        //
    }
};
#define ClassName Server
#include "generic_class.h"
#undef ClassName

#define ClassName Clients
#include "generic_class.h"
#undef ClassName