Каков наименьший заголовок Windows, я могу #include для определения DWORD?

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

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

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

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

[РЕДАКТИРОВАНИЕ] спасибо за Ваши ответы. Тем, кто предложил использовать другой тип, позвольте мне объяснить, почему это не желательно в этом случае: я настроил различные, определенные для платформы версии двух функций в файлах другого источника и прошу, чтобы конфигурация 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.

13
задан j_random_hacker 18 March 2010 в 23:13
поделиться

7 ответов

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

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

3
ответ дан 1 December 2019 в 22:38
поделиться

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

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

1
ответ дан 1 December 2019 в 22:38
поделиться

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

Вы могли бы сделать что-то подобное.

#ifndef _WINDEF_
typedef unsigned long DWORD;
#endif

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

5
ответ дан 1 December 2019 в 22:38
поделиться

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

2
ответ дан 1 December 2019 в 22:38
поделиться

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

4
ответ дан 1 December 2019 в 22:38
поделиться

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

1
ответ дан 1 December 2019 в 22:38
поделиться

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

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

1
ответ дан 1 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: