Удалить константы зависимости из определения enum - PullRequest
0 голосов
/ 24 февраля 2010

Я пытаюсь безопасно удалить зависимость из своего проекта, используя непрозрачные структуры и предварительные объявления, но, как и большинство, я все еще застрял в своих перечислениях.

Зависимость файла заголовка, которую я пытаюсь удалить из файлов заголовка, определила константы, которым я хочу установить значения моего перечисления. Как то так

// depends header
#define DEP_TYPE_ONE   1
#define DEP_TYPE_TWO   2
#define DEP_TYPE_THREE 3

// My header
enum TYPES
{
    T_ONE     = DEP_TYPE_ONE,
    T_TWO     = DEP_TYPE_TWO,
    T_THREE   = DEP_TYPE_THREE
}

Я пытаюсь найти способ не включать заголовок зависимости в мой заголовок.

Скорее всего, ответ, скорее всего, прост: «Вы не можете этого сделать», но я просто хочу спросить, потому что решение сделало бы мою жизнь бесконечной легче.

Ответы [ 4 ]

1 голос
/ 24 февраля 2010

Как насчет удаления включения заголовка зависимости, жесткого кодирования значений и комментирования зависимости:

// my_header.h

// NOTE: Enumerands must be in sync with symbols defined in depends.h
enum TYPES
{
    T_ONE     = 1, // DEP_TYPE_ONE
    T_TWO     = 2, // DEP_TYPE_TWO
    T_THREE   = 3  // DEP_TYPE_THREE
};

Чтобы устранить опасения по поводу несоответствия значений, у вас может быть другой заголовочный файл или исходный файл (тот, который не получают пользователи вашего класса или API), который содержит одно или несколько утверждений времени компиляции:

// Some non-distributed file

#include <depends.h>
#include "my_header.h"

// Compile-time assertion macro
#define compile_time_assert(cond, msg) \
    typedef char msg[(cond) ? 1 : -1]

// Check assumptions at compile time...
compile_time_assert(T_ONE==DEP_TYPE_ONE, ValueOutOfSync1);
compile_time_assert(T_TWO==DEP_TYPE_TWO, ValueOutOfSync2);
    .
    .
    .

Это даст вам ошибку времени компиляции, если значения когда-нибудь выйдут из синхронизации.

Для получения дополнительной информации о макросе compile_time_assert см .: http://www.embedded.com/columns/programmingpointers/164900888?_requestid=379501

0 голосов
/ 24 февраля 2010

Не идеальный ответ, но рассматривали ли вы анонимные перечисления ? Однажды у меня была похожая проблема, когда я использовал библиотеку диаграмм, которая определяла много констант в заголовке с большой внутренней зависимостью. Это влияло на наше время компиляции. Итак, я просто MOCked весь #define's в анонимное перечисление в анонимном пространстве имен в заголовке! Что-то вроде: -

namespace {
  enum {
    DEP_TYPE_ONE = 1,
    DEP_TYPE_TWO,
    // ....
    DEP_TYPE_LAST
  };
}

При таком подходе вам не придется реорганизовывать много кода, который напрямую использует эти именованные константы. Но это кошмар обслуживания для обновления перечисления, как только заголовок определяет новые константы.

Хорошо, стоит попробовать в вашем случае, я думаю.

НТН,

0 голосов
/ 24 февраля 2010

Вы правы, вы не можете. Здесь вы имеете дело с препроцессором, а не с компилятором (как с предварительными объявлениями).

Может быть возможно «подделать его», если ваш компилятор поддерживает опцию «принудительное включение» , но зависимость все еще сохраняется, и вам все еще нужен файл для сборки.

0 голосов
/ 24 февраля 2010

Это не то, что вам нужно, но это единственный способ не включать заголовочный заголовок в ваш заголовок:

enum TYPES 
{ 
    T_ONE     = 1, 
    T_TWO     = 2, 
    T_THREE   = 3 
} 
...