Идея родилась в результате работы над проектом с кучей конфигураций (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');
Может быть, идея не нова, но мне полезно
Н>С использованием этих макросов первый кусок кода переписывается так:
Н>Н>_tcsncpy(m_nidData.szInfo, lpszText, PD_IE50ABOVE(127, 63));
Н>m_nidData.szInfo[PD_IE50ABOVE(127, 63)] = _T('\0');
Н>
Ну и соответственно флаги всякие:
ListView_SetExtendedListViewStyle(m_hwndList, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_LABELTIP);
Это хотя и будет работать с библиотекой Common Controls ниже 5.8, но компилироваться при установках, соответствующих, к примеру, версии 4.71, не будет.
А так — будет:
ListView_SetExtendedListViewStyle(m_hwndList, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | PD_ISCOMMCTRL58ABOVE(LVS_EX_LABELTIP, 0));
Здравствуйте, Нахлобуч, Вы писали:
Н>Идея родилась в результате работы над проектом с кучей конфигураций (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
Н>
А такой код чем не подходит?
_tcsncpy(m_nidData.szInfo, lpszText, ARRSIZE(m_nidData.szInfo) );
m_nidData.szInfo[ARRSIZE(m_nidData.szInfo)-1] = _T('\0');
где
#define ARRSIZE(x) (sizeof((x))/sizeof((x)[0]))
Здравствуйте, MShura, Вы писали:
MS>А такой код чем не подходит?
MS>MS>_tcsncpy(m_nidData.szInfo, lpszText, ARRSIZE(m_nidData.szInfo) );
MS>m_nidData.szInfo[ARRSIZE(m_nidData.szInfo)-1] = _T('\0');
MS>
Ну это только одна сторона медали

.
Re: [Идейка] Условная компиляция ревизитедАвтор: Нахлобуч
Дата: 22.03.05
Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, MShura, Вы писали:
MS>>А такой код чем не подходит?
MS>>MS>>_tcsncpy(m_nidData.szInfo, lpszText, ARRSIZE(m_nidData.szInfo) );
MS>>m_nidData.szInfo[ARRSIZE(m_nidData.szInfo)-1] = _T('\0');
MS>>
Н>Ну это только одна сторона медали
.
Н>Re: [Идейка] Условная компиляция ревизитедАвтор: Нахлобуч
Дата: 22.03.05
По моему тогда проще писать так (в каком-нибудь общем файле заголовке)
#ifndef LVS_EX_LABELTIP
#define LVS_EX_LABELTIP 0
#endif