最近在学习itk中发现了itk这样的写法,如下:
itkGetMacro(name,type);
而后就可以调用函数名Getname获取type类型的返回值,一直不理解其意思,查看背后源码为如下:
/** Get built-in type. Creates member Get"name"() (e.g., GetVisibility()); */
#define itkGetMacro(name, type) \
virtual type Get##name () \
{ \
return this->m_##name; \
}
从源码中可以看出,其实是define宏定义,其中##表示连接符号,其实就是定义了一个虚函数,后续继承itk的类方便写而已。
为方便理解,我写了如下函数段:
#include<iostream>
#define Test(name,type) type Get##name (){std::cout<<1;return 1;} //宏定义函数
Test(abc,int);//函数声明
int main() {
Getabc();//函数调用
}
需要注意的是,itk中是一个virtual函数,所以函数只能在类中声明调用。
宏定义函数的优点如下:
优点:对输入无限制,减少系统开销,提高运行效率。预处理阶段进行宏展开,在执行时不需要转换,即在当地执行。
缺点:占用目标代码空间大,难阅读。但其存在代码区,其实该部分除了难阅读外,不算劣势。