В С++, как я могу сделать typedefs видимыми для каждого файла в моем проекте?
У меня есть typedef
typedef unsigned int my_type;
используемый в файле. Я хотел бы сделать его видимым во всех моих файлах без
помещая его в заголовочный файл, включенный всем. Я не хочу идти в заголовочный файл
маршрут, поскольку он будет стоять, это будет единственное объявление в файле заголовка
(и, как представляется, нет необходимости добавлять файл только для этого).
Есть ли способ сделать это?
Если бы у меня было:
typedef X my_type;
где X был классом, мне нужно будет включать X.h всюду и иметь typedef в конце
от X.h?
Ответы
Ответ 1
Я не хочу идти по файлу заголовка, потому что, поскольку он стоит, это будет единственное объявление в файле заголовка (и, кажется, не нужно добавлять файл только для этого). < ш > В чем проблема? Кажется совершенно ненужным избегать создания файла любой ценой.
Есть ли способ сделать это?
Не насколько я знаю.
мне нужно будет включать X.h всюду и иметь typedef в конце X.h?
Нет, но это, наверное, самое лучшее. Единственная причина, по которой вы должны это сделать, - это X - шаблон, и вам все равно нужны шаблоны в заголовках.
Ответ 2
По крайней мере, это невозможно. Почему бы вам не создать заголовочный файл globals.h с объявлениями, которые вы хотите повсюду, и включить их?
Не поддавайтесь соблазну похоронить свой typedef где-нибудь и надеяться, что "поскольку все остальное зависает от заголовка", это будет так же хорошо, как добавление глобального заголовка, - это очень плохая практика иметь заголовки, которые не являются собственностью содержится.
Кроме того, чтобы предотвратить загромождение глобального пространства имен, создайте свой собственный:
namespace MyTypes
{
typedef A B;
const unsigned int g_nMyGlobalType = 10;
// etc.
}
Таким образом, вы можете использовать свои глобальные переменные красивым образом:
MyTypes::B myVar; // etc
Ответ 3
Я бы использовал маршрут заголовка, это не так уж плохо.
Нет, вам не нужно будет включать X.h везде, только там, где вы используете typedef.
Ответ 4
Нет, нет способа обойтись, чтобы иметь 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
в любом случае.
Ответ 5
Объявление чего-либо (например, класса, typedef, function) в блоке перевода (например, файл cpp) на самом деле является довольно стандартным способом сказать, что "это используется только в этом файле", потому что невозможно ссылаться на него из других файлов. Единицы перевода не имеют представления о существовании друг друга, кроме деклараций (например, прототипов), разделяемых файлами .h, которые не говорят ничего о реализации. Это компоновщик, который принимает все реализации и вставляет их вместе в двоичный файл.
Если вы хотите, чтобы он был виден вне файла - поместите его в файл .h и включите его. Как и другие ответы, общий или глобальный файл .h может оказаться полезным. Некоторые компиляторы, которые используют предварительно скомпилированные заголовки, делают это проще - поместите его в предварительно скомпилированный заголовок.