c++代码里宏定义的理解

tech2025-12-29  8

最近看代码经常看到许多宏定义,尤其是带换行\,和##的,比较难读懂,针对这种找了个典型来理解一下。 以下是vtk库中的代码,宏定义为:

// // Set built-in type. Creates member Set"name"() (e.g., SetVisibility()); // #define vtkSetMacro(name,type) \ virtual void Set##name (type _arg) \ { \ vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " #name " to " << _arg); \ if (this->name != _arg) \ { \ this->name = _arg; \ this->Modified(); \ } \ }

函数声明为:

//@{ /** * Enable/disable drawing the axis labels. */ vtkSetMacro(AxisLabels, vtkTypeBool);

调用这个函数时的一个例子:

actor2->SetAxisLabels(0);

对这个宏定义的理解:首先,比较长的宏定义换行需要用\,而不是回车,因此先忽略 #会将后面的参数替换成一个字符串,##会将前后参数相连 将name和type进行替换,那么函数声明,便被替换为:

virtual void SetAxisLabels (vtkTypeBool _arg) \ { \ vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " AxisLabels " to " << _arg); \ if (this->AxisLabels!= _arg) \ { \ this->AxisLabels= _arg; \ this->Modified(); \ } \ }

这样就好理解了,函数里第一条是vtk的debug信息,不用理会,后续可以看到这个函数的含义是将本对象的AxisLabels进行modify。利用宏来实现这个函数功能的好处是,只需要一行代码,利用宏替换后,就可以声明并定义一个函数,函数参数类型可以是多种(现在利用模板应该也可以),另外函数名也可以是多种,这里是setAxisLabels,还可以set其它各种,只要是判断私有变量并对私有变量进行modify的,都可以通过此宏,写一行代码就可以实现,看起来非常方便。

最新回复(0)