[Идейка] Условная компиляция ревизитед
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 22.03.05 09:18
Оценка: 16 (3)
Идея родилась в результате работы над проектом с кучей конфигураций (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');


Может быть, идея не нова, но мне полезно
HgLab: Mercurial Server and Repository Management for Windows
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.