Хорошо, для констант это можно обойти, но в h файлах очень много разных #ifdef не только для констант, но и для структур и функций, например:
#if(WINVER >= 0x0400)
typedef struct tagMENUITEMINFOA
{
UINT     cbSize;
UINT     fMask;
UINT     fType;         // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
UINT     fState;        // used if MIIM_STATE
UINT     wID;           // used if MIIM_ID
HMENU    hSubMenu;      // used if MIIM_SUBMENU
HBITMAP  hbmpChecked;   // used if MIIM_CHECKMARKS
HBITMAP  hbmpUnchecked; // used if MIIM_CHECKMARKS
ULONG_PTR dwItemData;   // used if MIIM_DATA
LPSTR    dwTypeData;    // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
UINT     cch;           // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
#if(WINVER >= 0x0500)
HBITMAP  hbmpItem;      // used if MIIM_BITMAP
#endif /* WINVER >= 0x0500 */
}   MENUITEMINFOA, FAR *LPMENUITEMINFOA;

Здесь в зависимости от версии Windows запись содержит или не содержит одно поле.
Кроме того, некоторые функции объявлены только для новых версий Windows, и может получиться так, что программист будет расчитывать, что данная функция есть, раз она описана, а при запуске программы на более старой Windows, программа не найдет данную функцию.