Подтвердить что ты не робот

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

У меня есть typedef

 typedef unsigned int my_type;

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

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

Если бы у меня было:

typedef X my_type;

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

4b9b3361

Ответ 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 может оказаться полезным. Некоторые компиляторы, которые используют предварительно скомпилированные заголовки, делают это проще - поместите его в предварительно скомпилированный заголовок.