我有一个根据编译标志而变化的类。 我想在同一范围内实例化该类的两个版本。
my_class.h
#ifndef MY_CLASS_H
#define MY_CLASS_H
#ifdef COMP_FLAG
#define MY_CLASS MyClassFlagged
#else
#define MY_CLASS MyClassNotFlagged
#endif
class MY_CLASS
{
};
#endif
然后,我创建了两个头文件:
my_class_flagged.h
和 my_class_not_flagged.h
my_class_flagged.h
#ifndef MY_CLASS_FLAGGED
#define MY_CLASS_FLAGGED
#include "my_class.h"
#endif
my_class_not_flagged.h
#ifndef MY_CLASS_NOT_FLAGGED
#define MY_CLASS_NOT_FLAGGED
#include "my_class.h"
#endif
我使用 bazel 作为构建系统,因此我使用
COMP_FLAG
编译它们,不使用它来创建两个单独的目标。
BUILD
cc_library(
name = "not_flagged",
hdrs = ["my_class.h"],
)
cc_library(
name = "flagged",
hdrs = ["my_class.h"],
defines = ["COMP_FLAG"],
)
cc_library(
name = "my_class_flagged",
hdrs = ["my_class_flagged.h"],
deps = [":flagged"],
)
cc_library(
name = "my_class_not_flagged",
hdrs = ["my_class_not_flagged.h"],
deps = [":not_flagged"],
)
然后我无法实例化它们两个,而只能实例化一个:
#include "my_class_flagged.h"
#include "my_class_not_flagged.h"
// NOT BUILD
TEST(MyClassNotFlaggedTest, NotFlaggedInstantiation)
{
MyClassNotFlagged my_class_not_flagged;
std::ignore = my_class_not_flagged;
}
// PASS
TEST(MyClassFlaggedTest, FlaggedInstantiation)
{
MyClassFlagged my_class_flagged;
std::ignore = my_class_flagged;
}
出现此错误:
error: 'MyClassNotFlagged' was not declared in this scope; did you mean 'MyClassFlagged'?
我用过的地方:
cc_test(
name = "test",
srcs = ["test.cpp"],
deps = [
":my_class_flagged",
":my_class_not_flagged",
],
)
我尝试修改
my_class.h
文件:
#ifdef COMP_FLAG
#ifndef MY_CLASS_FLAGGED_H
#define MY_CLASS_FLAGGED_H
#define MY_CLASS MyClassFlagged
class MY_CLASS
{
};
#endif // MY_CLASS_FLAGGED_H
#else
#ifndef MY_CLASS_NOT_FLAGGED_H
#define MY_CLASS_NOT_FLAGGED_H
#define MY_CLASS MyClassNotFlagged
class MY_CLASS
{
};
#endif // MY_CLASS_NOT_FLAGGED_H
#endif
但是,现在我的两个测试都没有构建:
error: 'MyClassNotFlagged' was not declared in this scope
error: 'MyClassFlagged' was not declared in this scope
.
恐怕这不是答案,因为从评论中可以明显看出您的示例过于简化。不管怎样,你似乎把一些非常简单的事情变得复杂了。尽可能使用该语言,仅在需要时才使用预处理器进行条件编译。您的示例中没有任何内容真正需要预处理器。
您可以定义一个类模板:
template <int tag>
struct MY_CLASS {};
using MyClassFlagged = MY_CLASS<0>;
using MyClassNotFlagged = MY_CLASS<1>;
有多种方法可以确定此方法与定义两个单独的(非模板)类之间的差异,但对于大多数用途和应用程序来说,这种差异并不重要。