[Идейка] Условная компиляция ревизитед
От: Нахлобуч Великобритания 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
Re: [Идейка] Условная компиляция ревизитед
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 22.03.05 10:21
Оценка:
Н>С использованием этих макросов первый кусок кода переписывается так:

Н>
Н>_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));
HgLab: Mercurial Server and Repository Management for Windows
Re: [Идейка] Условная компиляция ревизитед
От: MShura  
Дата: 22.03.05 13:46
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Идея родилась в результате работы над проектом с кучей конфигураций (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]))
Re[2]: [Идейка] Условная компиляция ревизитед
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 22.03.05 13:48
Оценка:
Здравствуйте, 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
HgLab: Mercurial Server and Repository Management for Windows
Re[3]: [Идейка] Условная компиляция ревизитед
От: MShura  
Дата: 22.03.05 14:12
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.