c++,宏定义
很多大型的c++项目使用了很多的设计模式,其中就有很多宏定义,绕来绕去的很是头疼。同时,gcc编译的第一步预处理的时候会替换掉宏定义,这样相对来说就更好理解了。
gcc -E hello.c -o hello.i
预处理阶段包含:头文件展开,宏定义替换等
这里以nnvm项目中src/top/nn/convolution.cc
为例,进行尝试。源文件中有宏定义:
DMLC_REGISTER_PARAMETER(Conv2DParam);
NNVM_REGISTER_OP(conv2d)
这里我们直接用以下命令,注意用-I指定头文件的路径,不然会报错。
cd nnvm
g++ -E src/top/nn/convolution.cc -Iinclude -Idmlc-core/include -o conv.i
预处理之后的文件就是conv.i
,下面可以看一下两个宏定义预处理之后的形式:
// 1. DMLC_REGISTER_PARAMETER(Conv2DParam);
::dmlc::parameter::ParamManager *Conv2DParam::__MANAGER__() { static ::dmlc::parameter::ParamManagerSingleton<Conv2DParam> inst("Conv2DParam"); return &inst.manager; } static __attribute__((unused)) ::dmlc::parameter::ParamManager& __make__Conv2DParamParamManager__ = (*Conv2DParam::__MANAGER__());
2. NNVM_REGISTER_OP(conv2d)
static __attribute__((unused)) ::nnvm::Op & __make_NnvmOp_conv2d0 = ::dmlc::Registry<::nnvm::Op>::Get()->__REGISTER_OR_GET__("conv2d")
总结
这种方式方便理解项目