返回首页

我想整块的代码,简化成一系列宏观报表,但我不能确定如何使一个宏,实际上包括方括号。我有类叫做实体和一个成员函数调用GetParams,但我希望做一个宏,使下面的宏可以写在功能之后,开始功能。例如:

#define DATA_LAYOUT_START(type) {  void type::GetParams(ifstream & in){  }

#define DATA_LAYOUT_END()   {  }  }

然后我让每个参数的类型一堆宏,以便它看起来像这样的东西。
{C}
所以我的问题是,它可能有宏替换本身,从字面上用花括号启动功能,

编辑:感谢的快速反应,每个班级的实际功能应该像这样在最后

void type::GetParams(ifstream & in) {

    in >> m_floatExample;

    in.getline(m_stringExample, 100, ' ');

    in >> m_intExample;

    // ... etc, except those variables are different for each class.

}

我想在这里使用宏的主要原因,所以没有tempation改变周围的职能。 GetParams是从基类继承了一个功能,改变参数或返回真的可以胡来。

回答

评论会员:保罗瓦 时间:2012/02/06
这将帮助我,如果你提供一段代码,你想有作为最终的代码,并有可能将它标记为粗体,这样我就可以提供更具体的帮助
在一般情况下,你可以做任何预处理器,一个不同的问题是你是否应该或不。

如果你想声明你的函数的函数原型,作为一个宏,你可以这样做:
(编辑:固定下面的宏定义,原本是复制粘贴错误被定义为DATA_LAYOUT_START的两个宏)
{体C3}
如果您想您的宏扩展到多行,结束最后一个字符就行了,应继续\
宏将在第一线,没有延续字符结束。
例如:

{的C4}
MFC和ATL经常使用宏表。对于查阅BEGIN_MSG_MAP一个很好的例子,在atlwin.h。实现此功能与ATL一个万家乐表定义窗口的窗口过程:查克・奥图尔:此外,宏都只是"编译时佣工",认为他们是"轻度智能打字员",无论你把后宏的名称被认为是文字。在你的例子,,你immedately启动与柯利支撑,如果你认为这是定义语法的一部分。不,柯利支撑将包括在每一个宏扩展。

正如保罗说,有一个延续字符(\),使宏扩展到多行。终止宏定义,是唯一一个没有续行,有没有"结束柯利括号"

的Windows / MFC BEG​​IN_MESSAGE_MAP / END_MESSAGE_MAP宏做了类似的事情,周围一些其他的宏代码的存在和最终包装。你可能想看看这些宏如何写。他们在afxwin.h忽略是多么的消息映射的工作原理(粘贴以下)是,这些包装宏的语法应该是在写你的帮助。

{C5的}
评论会员:游客 时间:2012/02/06
SAKryukov:宏是邪恶的。不这样做。它通常可以简化代码,使用语言的抽象,不宏。mdash;SA