c++中根据同一个头文件的不同编译标志实例化不同的类

问题描述 投票:0回答:1

我有一个根据编译标志而变化的类。 我想在同一范围内实例化该类的两个版本。

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",
    ],
)

解决方案尝试

[463035818_is_not_an_ai]包含防护的问题

我尝试修改

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
.

c++ c-preprocessor bazel conditional-compilation compiler-flags
1个回答
0
投票

恐怕这不是答案,因为从评论中可以明显看出您的示例过于简化。不管怎样,你似乎把一些非常简单的事情变得复杂了。尽可能使用该语言,仅在需要时才使用预处理器进行条件编译。您的示例中没有任何内容真正需要预处理器。

您可以定义一个类模板:

template <int tag> 
struct MY_CLASS {};   

using MyClassFlagged = MY_CLASS<0>;
using MyClassNotFlagged = MY_CLASS<1>;

有多种方法可以确定此方法与定义两个单独的(非模板)类之间的差异,但对于大多数用途和应用程序来说,这种差异并不重要。

© www.soinside.com 2019 - 2024. All rights reserved.