OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 3130|回复: 1

请教:关于宏替换的问题

[复制链接]
发表于 2008-12-17 16:57:28 | 显示全部楼层 |阅读模式
#define ICV_DEF_INIT_ARITHM_FUNC_TAB( FUNCNAME, FLAG )          \
static  void  icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )\
{                                                               \
    tab->fn_2d[CV_8U] = reinterpret_cast<void*>(icv##FUNCNAME##_8u_##FLAG);       \
    tab->fn_2d[CV_8S] = 0;                                                        \
    tab->fn_2d[CV_16U] = reinterpret_cast<void*>(icv##FUNCNAME##_16u_##FLAG);     \
    tab->fn_2d[CV_16S] = reinterpret_cast<void*>(icv##FUNCNAME##_16s_##FLAG);     \
    tab->fn_2d[CV_32S] = reinterpret_cast<void*>(icv##FUNCNAME##_32s_##FLAG);     \
    tab->fn_2d[CV_32F] = reinterpret_cast<void*>(icv##FUNCNAME##_32f_##FLAG);     \
    tab->fn_2d[CV_64F] = reinterpret_cast<void*>(icv##FUNCNAME##_64f_##FLAG);     \
}

ICV_DEF_INIT_ARITHM_FUNC_TAB(Sub,C1R)
ICV_DEF_INIT_ARITHM_FUNC_TAB(SubRC,C1R)
ICV_DEF_INIT_ARITHM_FUNC_TAB(Add,C1R)
ICV_DEF_INIT_ARITHM_FUNC_TAB(AddC,C1R)

下面四句替换过后的是什么?只写一个语句的宏替换就可以了,谢谢各位有心人.
回复

使用道具 举报

发表于 2008-12-17 21:02:28 | 显示全部楼层

请教:关于宏替换的问题

先说原因再说结果:
##是个ANSI C99的标准预处理宏,其意思就是将前后两个字符串连接成为一个字符串,比如a##b就是ab,当然,这只发生在编译的预处理宏替换阶段,是个纯文本过程。这个技巧应用还是相当广泛的。

这个问题的结果,你其实完全可以自己搞定的,方法:
gcc -E xxx.c -o xxx.i,执行预处理阶段,然后看生成xxx.i就知道宏替换的结果了。

ICV_DEF_INIT_ARITHM_FUNC_TAB(Sub,C1R)替换之后就是:
static  void  icvInitSubC1RTable( CvFuncTable* tab )
{
    tab->fn_2d[CV_8U] = reinterpret_cast<void*>(icvSub_8u_C1R);
    tab->fn_2d[CV_8S] = 0;
    tab->fn_2d[CV_16U] = reinterpret_cast<void*>(icvSub_16u_C1R);
    tab->fn_2d[CV_16S] = reinterpret_cast<void*>(icvSub_16s_C1R);
    tab->fn_2d[CV_32S] = reinterpret_cast<void*>(icvSub_32s_C1R);
    tab->fn_2d[CV_32F] = reinterpret_cast<void*>(icvSub_32f_C1R);
    tab->fn_2d[CV_64F] = reinterpret_cast<void*>(icvSub_64f_C1R);
}
#define ICV_DEF_INIT_ARITHM_FUNC_TAB( FUNCNAME, FLAG )          \\
static  void  icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )\\
{                                                               \\
    tab->fn_2d[CV_8U] = reinterpret_cast<void*>(icv##FUNCNAME##_8u_##FLAG);       \\
    tab->fn_2d[CV_8S] = 0;                                                        \\
    tab->fn_2d[CV_16U] = reinterpret_cast<void*>(icv##FUNCNAME##_16u_##FLAG);     \\
    tab->fn_2d[CV_16S] = reinterpret_cast<void*>(icv##FUNCNAME##_16s_##FLAG);     \\
    tab->fn_2d[CV_32S] = reinterpret_cast<void*>(icv##FUNCNAME##_32s_##FLAG);     \\
    tab->fn_2d[CV_32F] = reinterpret_cast<void*>(icv##FUNCNAME##_32f_##FLAG);     \\
    tab->fn_2d[CV_64F] = reinterpret_cast<void*>(icv##FUNCNAME##_64f_##FLAG);     \\
}

ICV_DEF_INIT_ARITHM_FUNC_TAB(Sub,C1R)
ICV_DEF_INIT_ARITHM_FUNC_TAB(SubRC,C1R)
ICV_DEF_INIT_ARITHM_FUNC_TAB(Add,C1R)
ICV_DEF_INIT_ARITHM_FUNC_TAB(AddC,C1R)

下面四句替换过后的是什么?只写一个语句的宏替换就可以了,谢谢各位有心人.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-18 18:19 , Processed in 0.010003 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表