Обычной практикой является определение символических констант в заголовочном файле:
#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
заявления?Мой уровень понимания говорит «нет», но я знаю, что не все знаю. 😉
Для использования в качестве switch
в метках операторов значения должны быть видны компилятору ранее в источнике этого модуля перевода.
По сути, нет, Вы не можете объявлять символические константы без раскрытия их значений и использовать их в качестве меток в switch
,
Тем не менее, вы можете использовать if
—else
строительство.
Вы можете хранить указатели на методы / функции, сопоставленные с T_Type где-нибудь, но да, это всего лишь проблемы, которые не стоит создавать в первую очередь — жестко закодированная логика может работать только с жестко закодированными значениями.
Ваше объявление 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;