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