如何解决将此代码转换为宏
我当前拥有的示例代码:
a = b;
我希望宏实现新逻辑:
if(b != "" and b != " ")
a = b;
所以,如果可能,我想要一个这样的宏:
a = VALUE(b);
a
和b
的类型为CString
。我知道我可以通过编写inline
方法来实现这一点,但是我想知道使用MACRO是否可以实现?
我有几个变量,在分配值时要在其中应用此逻辑。
解决方法
关于在CString
结构中批量复制S_TALK_INFO
个顺序字段的建议:
您的SetValue
函数的名称不能反映它的作用。我将其替换为:
bool IsValid(const CString& str)
{
return !str.IsEmpty() && !_istspace(str[0]);
}
这是犹太洁食吗?您将必须维护第一个字段和最后一个字段的名称,但是现在您必须维护的更多...
void CWeekendMeetingDlg::SetWeekendMeetingInfo(S_TALK_INFO &rsTalkInfo)
{
for (CString* pSrc = &rsTalkInfo.strAwayCong1,*pDst = &m_sWMInfo.strAwayCong1;
pSrc <= &rsTalkInfo.strClosingPrayer;
pDst++,pSrc++)
{
if(IsValid(*pSrc))
*pDst = *pSrc;
}
// the "int" stuff
}
Re:UB-这样做(对于每个连续对)有帮助吗?
static_assert(offsetof(S_TALK_INFO,strAwayCong2) - offsetof(S_TALK_INFO,strAwayCong1)
== sizeof(CString));
,
基于敦促我使用inline
函数的评论,并鉴于我的特定要求,我最终完成了以下操作。
- 这是我的
struct
对象,其定义无法更改:
typedef struct tagPublicTalkInfo
{
CString strAwayCong1;
CString strAwayCong2;
CString strAwayBrother1;
CString strAwayBrother2;
CString strAwayTalkNumber1; // AJT v20.1.9
CString strAwayTalkNumber2; // AJT v20.1.9
CString strChairman;
CString strCong;
CString strHosp;
CString strReader;
CString strBrother;
CString strTheme;
CString strWTConductor; // AJT v10.7.2
CString strInterpreter; // AJT v16.2.1
CString strMisc; // AJT v16.2.1
CString strWatchtowerStudyTheme; // AJT v17.0.5
CString strServiceTalkTheme; // AJT v17.0.7
CString strBibleVersesReader; // AJT v20.0.1
CString strVideoHost; // AJT v20.1.4
CString strVideoCohost; // AJT v20.1.4
CString strOpeningPrayer; // AJT v20.1.6
CString strClosingPrayer; // AJT v20.1.6
int iSongStart; // AJT v20.0.1
int iSongMiddle; // AJT v20.0.1
int iSongEnd; // AJT v20.0.1
int iThemeNumber; // AJT v20.1.6
} S_TALK_INFO;
- 我添加了这个新的
inline
方法:
void SetValue(CString& rStrCurrentValue,CString strNewValue)
{
if (strNewValue != _T("") && strNewValue != _T(" "))
rStrCurrentValue = strNewValue;
}
- 最后,我调整了
SetWeekendMeetingInfo
方法,现在看起来像这样:
void CWeekendMeetingDlg::SetWeekendMeetingInfo(S_TALK_INFO &rsTalkInfo)
{
//m_sWMInfo = rsTalkInfo;
SetValue(m_sWMInfo.strAwayCong1,rsTalkInfo.strAwayCong1);
SetValue(m_sWMInfo.strAwayCong2,rsTalkInfo.strAwayCong2);
SetValue(m_sWMInfo.strAwayBrother1,rsTalkInfo.strAwayBrother1);
SetValue(m_sWMInfo.strAwayBrother2,rsTalkInfo.strAwayBrother2);
SetValue(m_sWMInfo.strAwayTalkNumber1,rsTalkInfo.strAwayTalkNumber1);
SetValue(m_sWMInfo.strAwayTalkNumber2,rsTalkInfo.strAwayTalkNumber2);
SetValue(m_sWMInfo.strChairman,rsTalkInfo.strChairman);
SetValue(m_sWMInfo.strCong,rsTalkInfo.strCong);
SetValue(m_sWMInfo.strHosp,rsTalkInfo.strHosp);
SetValue(m_sWMInfo.strReader,rsTalkInfo.strReader);
SetValue(m_sWMInfo.strBrother,rsTalkInfo.strBrother);
SetValue(m_sWMInfo.strTheme,rsTalkInfo.strTheme);
SetValue(m_sWMInfo.strWTConductor,rsTalkInfo.strWTConductor);
SetValue(m_sWMInfo.strInterpreter,rsTalkInfo.strInterpreter);
SetValue(m_sWMInfo.strMisc,rsTalkInfo.strMisc);
SetValue(m_sWMInfo.strWatchtowerStudyTheme,rsTalkInfo.strWatchtowerStudyTheme);
SetValue(m_sWMInfo.strServiceTalkTheme,rsTalkInfo.strServiceTalkTheme);
SetValue(m_sWMInfo.strBibleVersesReader,rsTalkInfo.strBibleVersesReader);
SetValue(m_sWMInfo.strVideoHost,rsTalkInfo.strVideoHost);
SetValue(m_sWMInfo.strVideoCohost,rsTalkInfo.strVideoCohost);
SetValue(m_sWMInfo.strOpeningPrayer,rsTalkInfo.strOpeningPrayer);
SetValue(m_sWMInfo.strClosingPrayer,rsTalkInfo.strClosingPrayer);
m_sWMInfo.iSongStart = rsTalkInfo.iSongStart;
m_sWMInfo.iSongMiddle = rsTalkInfo.iSongMiddle;
m_sWMInfo.iSongEnd = rsTalkInfo.iSongEnd;
m_sWMInfo.iThemeNumber = rsTalkInfo.iThemeNumber;
}
它似乎可以正常工作。正如我所说,我无法更改struct
对象的定义,但是如果您认为这种方法可以改进,请通知我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。