В C++, как я могу сделать typedefs видимым для каждого файла в моем проекте?

у меня есть typedef

 typedef unsigned int my_type;

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

есть ли способ сделать это?

Если бы вместо этого у меня было:

typedef X my_type;

где X класс, мне нужно включить X. h везде и иметь typedef в конце х ?

5 ответов


Я не хочу идти по маршруту файла заголовка, потому что, как он стоит, это будет единственное объявление в файле заголовка (и кажется ненужным добавлять файл только для этого).
В чем проблема? Кажется также ненужным избегать создания файла любой ценой.

есть ли способ сделать это?
Насколько мне известно, нет.

Мне нужно будет включить X. h везде и иметь typedef в конце X. h ?
Нет, но это, наверное, самое лучшее. Единственная причина, по которой вы должны это делать, - это если X-шаблон, и вам все равно нужны шаблоны в заголовках.


нет способа обойти это, насколько я могу видеть. Почему бы тебе не сделать Глобал.H заголовочный файл с объявлениями, которые вы хотите везде, и включить это?

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

кроме того, чтобы предотвратить загромождение глобального пространства имен, создайте собственный:

namespace MyTypes
{
    typedef A B;
    const unsigned int g_nMyGlobalType = 10;
    // etc.
}

таким образом, вы можете использовать свои глобалы в хорошем лаконичном виде:

MyTypes::B myVar; // etc

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

нет, вам не нужно будет включать X. h везде, только в тех местах, где вы используете typedef.


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

если у вас

typedef X my_type;

и X - это класс, вы можете сделать это (в заголовке, кроме X.h):

class X;
typedef X my_type;

который вперед-объявляет X, а затем создает для него псевдоним типа. Тогда уже X.h включить этот файл.

тогда, если вам нужно только неполное typename my_type, вы можете включить очень короткий файл заголовка typedef, и вам нужно только включить X.h когда вам понадобилось бы полное определение для X класс в любом случае.


объявление чего-то (например. класс, typedef, функция) в блоке перевода (например. cpp file) на самом деле в значительной степени стандартный способ сказать "это используется только в этом файле", потому что невозможно ссылаться на него из других файлов. Единицы перевода понятия не имеют о существовании друг друга, кроме деклараций (например. прототипы) общие .H файлы-которые ничего не говорят о реализации. Это компоновщик, который берет все реализации и вставляет их вместе в к двоичному.

Если вы хотите, чтобы он был виден вне файла - поместите его в a .H-файл и включить его. Как подсказывают другие ответы, общий или глобальный .H-файл может быть полезен. Некоторые компиляторы, которые используют предварительно скомпилированные заголовки, упрощают это-помещают его в предварительно скомпилированный заголовок.