Какой самый маленький заголовок Windows, который я могу #include определить DWORD? - PullRequest
12 голосов
/ 19 марта 2010

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

Конечно, на практике я знаю, что DWORD - это просто unsigned int, но я бы предпочел более гигиеничный подход, если возможно, включить официальный заголовочный файл.

На на этой странице говорится, что DWORD определено в windef.h, но, к сожалению, включение только этого небольшого файла напрямую приводит к ошибкам компиляции - очевидно, он ожидает включения других заголовков. (Кроме того, тот факт, что мой файл является файлом заголовка, также означает, что я не могу просто объявить WIN32_LEAN_AND_MEAN, поскольку исходный файл, который включает в себя #include мой файл, может потребовать, чтобы его оставили неопределенным.)

Есть идеи? Я знаю, что это не конец света - я могу просто продолжить #include <windows.h> - но думал, что у кого-то может быть лучшая идея!

[EDIT] Спасибо за ваши ответы. Тем, кто предложил использовать другой тип, позвольте мне объяснить, почему в этом случае это нежелательно: я установил разные, специфичные для платформы версии двух функций в разных исходных файлах и попросил конфигурацию CMake определить текущую платформу. и выберите, какой построить. В Windows мои функции выглядят так:

typedef DWORD TimePoint;
TimePoint GetTimeNow(void);
double TimeDifference(TimePoint start, TimePoint end);

Версия Windows GetTimeNow() просто вызывает Windows API timeGetTime(), который имеет тип возврата DWORD, и поэтому он должен иметь тот же тип возврата. (На других платформах TimePoint будет иметь другой тип, например struct timeval на платформах UNIXy.) По сути, значения типа TimePoint непрозрачны, и единственное, что вы можете сделать с ними, это передать два из них TimeDifference() для измерения прошедшего времени между ними в секундах. Это позволяет кросс-платформенную разработку. К сожалению, это все еще означает, что клиентский код должен знать конкретный тип TimePoint.

Ответы [ 10 ]

4 голосов
/ 19 марта 2010

Я полагаю, что раньше вы могли включать winbase.h, но, похоже, это уже не так. Все источники, которые я видел, рекомендуют windows.h с опцией WIN32_LEAN_AND_MEAN. Как вы указали, последняя оптимизация вам не поможет.

Вы могли бы сделать что-то вроде этого.

#ifndef _WINDEF_
typedef unsigned long DWORD;
#endif

Не чисто, но эффективно. Этот typedef вряд ли когда-либо изменится.

4 голосов
/ 19 марта 2010

Включите Windows.h и используйте предварительно скомпилированные заголовки. Кстати, вы можете определить WIN32_LEAN_AND_MEAN, а затем отменить его позже!

3 голосов
/ 13 ноября 2014

Use this file: include <IntSafe.h>

2 голосов
/ 19 марта 2010

A DWORD всегда будет 32-битным беззнаковым целым, поэтому не имеет значения, используете ли вы DWORD или unsigned long или uint32_t. Если все три типа ссылаются на 32-разрядное целое число без знака, компилятор будет считать их эквивалентными.

Поскольку это часть файлов, специфичных для платформы, я не думаю, что вам нужно так сильно беспокоиться о переносимости. Черт возьми, копайся в заголовках, чтобы найти нативный тип DWORD и просто вставь этот typedef в свой заголовок. Компиляторы Си принимают дубликаты типов, если они имеют один и тот же базовый тип.

2 голосов
/ 19 марта 2010

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

1 голос
/ 29 ноября 2011

Есть ли , где вы находитесь? Потому что в этом я вижу:

#ifndef _DWORD_DEFINED
#define _DWORD_DEFINED
typedef unsigned long DWORD;

#endif // !_DWORD_DEFINED

Этот файл находится здесь в разделе "... \ VC98 \ INCLUDE" .. это для VC6, поэтому я подумал, что это будет в более поздних версиях.

Я выполнил ту же задачу, что и ОП, и решил ее, включив указанный заголовок.

1 голос
/ 19 марта 2010

Если вы обеспокоены тем, что, когда ваша кроссплатформенная программа запускается в Windows, она загрузит слишком много библиотек DLL Windows только из-за того, что в вашем исходном коде был #include , я думаю, что вы слишком беспокоитесь. Даже Блокнот должен загрузить половину известного юниверса, и, как известно, время от времени загружался и выполнялся.

Если вы обеспокоены тем, что, когда другие разработчики используют Windows, ваш кроссплатформенный файл .h будет загрязнять пространство имен в их средах компиляции, я думаю, что вы слишком беспокоитесь. 99,999% проектов Windows уже сделали #include , прежде чем они попали в ваш файл .h.

1 голос
/ 19 марта 2010

Не используйте DWORD. Я видел слишком много кода Windows, который был перенесен на другие платформы позже. Эти DWORD-ы становятся настоящей проблемой, когда у каждого свое определение. Я не думаю, что есть какие-либо веские причины для использования определенных типов окон в интерфейсах.

Даже если ваш код никогда не будет перенесен на какую-либо другую платформу, я все же думаю, что код должен использовать нативные типы или ваши собственные типы (например, MyInt32, MyUInt64 и т. Д.), Но ничего из windows.h.

1 голос
/ 19 марта 2010

Почему бы вам не определить функцию для возврата int? Это очень переносимый тип, полностью отделяющий ваш код от империи зла Microsoft.

0 голосов
/ 24 мая 2017

Как насчет - #include <minwindef.h>?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...