Идея родилась в результате работы над проектом с кучей конфигураций (Unicode, Windows 98/NT, тра-та-та). Там полно кусков типа
#if _WIN32_IE < 0x0500
_tcsncpy(m_nidData.szInfo, lpszText, 63);
m_nidData.szInfo[63] = _T('\0');
#else
_tcsncpy(m_nidData.szInfo, lpszText, 127);
m_nidData.szInfo[127] = _T('\0');
#endif
Код, по сути, один и тот же и отличается только константами. Можно, конечно, ввести дополнительную константу, но все же остаются эти
#if #else #endif — мне не особо нравится. По сути, для компиляции под ту или иную платформу требуется выбор из двух элементов. Посему, к примеру:
//
// Unicode
#ifdef _UNICODE
#define ISUNICODE 1
#else
#define ISUNICODE 0
#endif // _UNICODE
//
// Unicode-dependent compilation
#if ISUNICODE == 1
#define PD_UNICODE(A, B) A
#else
#define PD_UNICODE(A, B) B
#endif // ISUNICODE
//
// IE version
#if _WIN32_IE > 0x0500
#define ISIE50ABOVE 1
#else
#define ISIE50ABOVE 0
#endif // _WIN32_IE
//
// IE-dependent compilation
#if ISIE50ABOVE == 1
#define PD_IE50ABOVE(A, B) A
#else
#define PD_IE50ABOVE(A, B) B
#endif // ISIE50ABOVE
//
// Ну и можно продолжить... _WIN32_WINNT, _WIN32_WINDOWS, WINVER - и т.д.
С использованием этих макросов первый кусок кода переписывается так:
_tcsncpy(m_nidData.szInfo, lpszText, PD_IE50ABOVE(127, 63));
m_nidData.szInfo[PD_IE50ABOVE(127, 63)] = _T('\0');
Может быть, идея не нова, но мне полезно