Создайте экземпляры разных классов в соответствии с разными флагами компиляции одного и того же файла заголовка в С++.C++

Программы на C++. Форум разработчиков
Anonymous
Создайте экземпляры разных классов в соответствии с разными флагами компиляции одного и того же файла заголовка в С++.

Сообщение Anonymous »

У меня есть класс, который варьируется в зависимости от флага компиляции.
Я хотел бы создать экземпляры обеих версий класса в одной области действия.

Код: Выделить всё

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.

Подробнее здесь: https://stackoverflow.com/questions/786 ... of-same-he

Вернуться в «C++»