У меня есть маленький мой собственный заголовочный файл, который объявляет несколько функций, одна из которых имеет тип возврата 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
.
A DWORD
всегда будет 32-битным беззнаковым int, поэтому на самом деле не имеет значения, используете ли вы DWORD
или unsigned long
или uint32_t
. Если все три типа относятся к 32-битному беззнаковому int, компилятор будет считать их эквивалентными.
Поскольку это часть файлов для конкретной платформы, я не думаю, что вам нужно так сильно беспокоиться о переносимости. Черт возьми, покопайтесь в заголовках, чтобы найти собственный тип DWORD
, и просто поместите этот typedef в свой заголовок. Компиляторы C принимают повторяющиеся определения типов, если они имеют один и тот же базовый тип.
Не используйте DWORD. Я видел слишком много кода Windows, который позже был перенесен на другие платформы. Эти DWORD становятся настоящей проблемой, когда у каждого есть свое определение для них. Я не думаю, что есть веские причины использовать в интерфейсах типы, специфичные для Windows.
Даже если ваш код никогда не будет перенесен на какую-либо другую платформу, я все же считаю, что код должен использовать собственные типы или ваши собственные (например, MyInt32, MyUInt64 и т. Д.), Но ничего из windows.h.
Я полагаю, вы раньше могли включать winbase.h, но, похоже, это больше не так. Все источники, которые я видел, рекомендуют windows.h с опцией WIN32_LEAN_AND_MEAN. Как вы указали, последняя оптимизация вам не помогает.
Вы могли бы сделать что-то подобное.
#ifndef _WINDEF_
typedef unsigned long DWORD;
#endif
Не чисто, но эффективно. Этот typedef вряд ли когда-либо изменится.
Я бы сказал, просто определите это самостоятельно. Таким образом, он более независим от платформы (конечно, я не знаю, требуется ли для остального кода Windows). Если вы не хотите этого делать, используйте предварительно скомпилированные заголовки.
Включите Windows.h и используйте предварительно скомпилированные заголовки. Кстати, вы можете определить WIN32_LEAN_AND_MEAN, а затем удалить его позже!
Почему бы вам вместо этого не определить функцию, возвращающую int
? Это очень переносимый тип и полностью избавляет ваш код от империи зла Microsoft.
Если вы обеспокоены тем, что, когда ваша кроссплатформенная программа работает в Windows, она загружает слишком много Windows DLL только потому, что в вашем исходном коде #include
Если вас беспокоит, что, когда другие разработчики используют Windows, ваш кроссплатформенный файл .h приведет к огромному загрязнению пространства имен в их средах компиляции, я думаю, вы слишком сильно беспокоитесь. 99,999% проектов Windows уже сделали #include