Прямое объявление анонимного typedef с битовыми полями в переполнении стека

Я нашел ответ для предварительного объявления typedef в C ++ (https://stackoverflow.com/a/2095798). Но моя ситуация выглядит так:

// a.h
typedef struct{
unsigned char bah0 : 1;
unsigned char bah1 : 1;
unsigned char bah2 : 1;
unsigned char bah3 : 1;
unsigned char bah4 : 1;
unsigned char bah5 : 1;
unsigned char bah6 : 1;
unsigned char bah7 : 1;
} bah;

// b.h
typedef struct bah;  // Error: using typedef-name 'bah' after struct

class foo {
foo(bah b);
bah mBah;
};

// b.cpp
#include "b.h"#include "a.h"
foo::foo(bah b)
{
mBah = b;
}

и мне не разрешено ничего менять в a.h и я хочу избежать в том числе a.h в b.h, Как я могу избежать этой ошибки или как правильно переадресовать declarte bah в этой ситуации?

Спасибо тебе!
Златан

1

Решение

Я хочу избегать включения а.ч. в б.ч

Очень плохо. ч.ч зависит от определения bah с утра Ваши желания расходятся с правилами языка.

Как я могу избежать этой ошибки

Вариант 1: Включить a.h в b.h. Я знаю, что вы этого не хотите, но я хочу включить все доступные варианты.

Вариант 2: не зависит от определений a.h ​​в b.h. Пример:

// b.h
class foo {
foo();
};

Следующий класс может быть определен только с предварительным объявлением bah:

class foo {
foo(bah* b);
bah* mBah;
};

Тем не менее, даже это невозможно, если вы не можете заранее объявить структуру. Так что это приводит нас к …

Каков правильный путь для продвижения declarte bah в этой ситуации?

Нет способа переслать объявление безымянной структуры. Если вы не можете изменить a.h, вы не можете дать имя тега для структуры. Предполагая, что вы можете изменить a.h, вот как вы это сделаете:

typedef struct bah { // struct now has the tag name bah
// ...
} bah;

Поскольку имя структуры делает typedef в основном избыточным, вы можете упростить до:

 struct bah {
// ...
};

После этого добавления вы можете переслать объявить:

struct bah;

Но предварительное объявление не позволит вам объявить переменные типа bah,


PS. Битовые поля не влияют на работу прямых объявлений.

2

Другие решения

В вашем решении слишком много зависимостей.
Определите бла один раз в общей части кода. Вы избежите переопределений.

Я бы порекомендовал определить бла в a.h как вы, а затем:

1) включить а.ч. внутри б.ч. Включить b.h внутри b.cpp

2) или включите a.h перед b.h внутри b.cpp

1

По вопросам рекламы [email protected]