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

У меня есть typedef

 typedef unsigned int my_type;

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

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

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

typedef X my_type;

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

Ответы [ 5 ]

18 голосов
/ 19 апреля 2010

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

Есть ли способ сделать это?
Не настолько, насколько я знаю.

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

9 голосов
/ 19 апреля 2010

Насколько я могу судить, это невозможно. Почему бы вам не создать заголовочный файл globals.h, содержащий только те объявления, которые вы хотите везде, и включить их?

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

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

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

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

MyTypes::B myVar; // etc
1 голос
/ 19 апреля 2010

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

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

0 голосов
/ 19 апреля 2010

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

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

0 голосов
/ 19 апреля 2010

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

Если у вас есть

typedef X my_type;

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

class X;
typedef X my_type;

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

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

...