Re: Re: [cpp]请问gcc 3.x下的一个模板问题

Li Jie cpunion at gmail.com
Wed May 3 18:24:22 CST 2006


ACE中有类似的代码,把宏参数用一个括号括起来,也就是有2层括号:
ACE_DEBUG ((LM_DEBUG, "xxxxx", xx, xx, xx));
大概是这个形式,你可以查看一下ACE的代码实现。

在 06-5-3,rockie<rockie at student.dlut.edu.cn> 写道:
> 吴咏炜,你是对的,已经在gcc 3.x下过了,非常感谢。
> 还有一个问题,也是郁闷了很久的,关于宏的参数问题。
> 即如何让一个宏支持参数数目可变的参数,如函数的...参数
> #ifdef ENABLE_LOG
>
> #include "logger.h"
> enum ChannelTag
> {
>        CT_NONE = 0,
>    CT_ERROR,
>        CT_PARSE,
>    CT_SEND,
>    CT_SENSE,
>    CT_NOTIFY,
>        //...
>        CT_MAX // append channel tags before this line
> };
>
> extern Logger LOGGER; //Logger是个容器,重载了->操作符
> #define DoLog LOGGER->Log
> //Log方法声明:
> //void Log(IndexType channel, const char* szFmt, ...);
> //使用例子:DoLog(CT_MEASURE, "FLAG1 not seen.");
>
> //#define AssertLog(x, y, z) if(!(x)){DoLog(y,z)} //这个是不行的,不能支持多参数
> //要问的问题:
> //如何定义一个宏使得可以实现如下功能?即
> //AssertLog(断言条件, CT_MEASURE, "FLAG1 not seen.");
> //并可支持可变数目的参数
> //AssertLog(断言条件, CT_PARSE, "Unknown vision sensation at time[%f]: [%s]", time, sense);
>
> #else //NOT ENABLE_LOG
>
> #ifdef _WIN32
>        #define DoLog(x) NULL
>   // #define AssertLog(x) NULL
> #else
>        #define DoLog(...) NULL
>   // #define AssertLog(...) NULL
> #endif //
>
> #pragma warning(disable: 4002)
>
> #endif //ENABLE_LOG
>
> ------------------
> rockie
> 2006-05-03



More information about the Cpp mailing list