Объявление символьных констант в заголовке без инициализации?

Обычной практикой является определение символических констант в заголовочном файле:

#define T_FOO 1
#define T_BAR 2

Некрасиво.

static const int T_FOO = 1;
static const int T_BAR = 2;

Лучше, так как не препроцессор.

enum
{
T_FOO = 1,
T_BAR
} T_Type;

Еще лучше, так как T_Type несет информацию цели, и компилятор может выполнять дополнительные проверки (например, если все случаи обрабатываются в switch).

Там, вероятно, еще полдюжины вариантов. Одна вещь, хотя … они все раскрывают числовые значения для клиента. Я бы хотел скрыть эти ценности просто потому, что они не должны иметь значения. Но один способ, которым я мог думать о …

typedef int T_Type;

// defined elsewhere
extern const T_Type T_FOO;
extern const T_Type T_BAR;

не работает например, case заявления (как T_FOO а также T_BAR являются константами, но не постоянными выражениями времени компиляции).

Является Есть ли способ получить все это?

  • Объявление символьных констант в заголовке без раскрытия числовых значений,
  • но может использоваться в качестве константных выражений, например в switch заявления?

Мой уровень понимания говорит «нет», но я знаю, что не все знаю. 😉

1

Решение

Для использования в качестве switch в метках операторов значения должны быть видны компилятору ранее в источнике этого модуля перевода.

По сути, нет, Вы не можете объявлять символические константы без раскрытия их значений и использовать их в качестве меток в switch,

Тем не менее, вы можете использовать ifelse строительство.

2

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

Вы можете хранить указатели на методы / функции, сопоставленные с T_Type где-нибудь, но да, это всего лишь проблемы, которые не стоит создавать в первую очередь — жестко закодированная логика может работать только с жестко закодированными значениями.

0

Ваше объявление typedef было неверным.
Что насчет этого?

typedef int T_Type;

// defined elsewhere

extern const T_Type T_FOO;
extern const T_Type T_BAR;

// elsewhere defined as, say
const T_Type T_FOO = 1;
const T_Type T_BAR = 2;
0