注册 登录
编程论坛 C++教室

一个关于可变参数宏的问题,求高人指点

walkingsk 发布于 2011-03-31 08:44, 284 次点击
首先,代码里的
程序代码:

SEARCHTFILE
SEARCHTTEXFILE
SEARCHTPATHTEX
SEARCHTPATHTEXD
SEARCHTPORTRAIT

都是已经定义好的宏,替换的是if语句

程序中有多个for循环

代码如下:
程序代码:

        for(int i=0,k;i<nos;++i)
        {
            scp(ch,fls[idx[i].fi]->pth);
            srp(ch,'\\','_');
            k=gtlen(ch);
            
            if(k>20&&!scma(ch+k-20,SLK_DESTRUCT))
            {
                Df(i);
               
                int coli;
                csk=new slk (fin,ch);
               
                SEARCHTFILE
                SEARCHTTEXFILE
                SEARCHTPATHTEX
                SEARCHTPATHTEXD
                SEARCHTPORTRAIT
               
                delete csk;
                break;
            }
        }
        
        for(int i=0,k;i<nos;++i)
        {
            scp(ch,fls[idx[i].fi]->pth);
            srp(ch,'\\','_');
            k=gtlen(ch);
            
            if(k>12&&!scma(ch+k-12,SLK_ITEMDATA))
            {
                Df(i);
                int coli;
                csk=new slk (fin,ch);
                SEARCHTFILE
                delete csk;
                break;
            }
        }
        
        for(int i=0,k;i<nos;++i)
        {
            scp(ch,fls[idx[i].fi]->pth);
            srp(ch,'\\','_');
            k=gtlen(ch);
            
            if(k>12&&!scma(ch+k-12,SLK_UNITDATA))
            {
                Df(i);
                int coli;
                csk=new slk (fin,ch);
                SEARCHTPATHTEX
                delete csk;
                break;
            }
        }
        
        for(int i=0,k;i<nos;++i)
        {
            scp(ch,fls[idx[i].fi]->pth);
            srp(ch,'\\','_');
            k=gtlen(ch);
            
            if(k>10&&!scma(ch+k-10,SLK_UNITUI))
            {
                Df(i);
                int coli;
                csk=new slk (fin,ch);
                SEARCHTFILE
                delete csk;
                break;
            }
        }
        
        for(int i=0,k;i<nos;++i)
        {
            scp(ch,fls[idx[i].fi]->pth);
            srp(ch,'\\','_');
            k=gtlen(ch);
            
            if(k>11&&!scma(ch+k-11,SLK_DOODAD))
            {
                Df(i);
                int coli;
                csk=new slk (fin,ch);
                SEARCHTFILE
                SEARCHTPATHTEX2
                delete csk;
                break;
            }
        }

现在想用一个带参数的宏替换for语句,length替换k<11中的11,tag替换SLK_DOODAD
比如这样:
程序代码:

#define SEARCH(length,tag,...)\
    for(int i=0,k;i<nos;++i)\
    {\
        scp(ch,fls[idx[i].fi]->pth);\
        srp(ch,'\\','_');\
        k=gtlen(ch);\
        \
        if(k>length&&!scma(ch+k-length,tag))\
        {\
            Df(i);\
            int coli;\
            csk=new slk (fin,ch);\
            ##__VA_ARGS__\
            delete csk;\
            break;\
        }\
    }\

关键在
##__VA_ARGS__
,如果写
SEARCH(20,SLK_DESTRUCT,SEARCHTFILE,SEARCHTTEXFILE,SEARCHTPATHTEX,SEARCHTPATHTEXD,SEARCHTPORTRAIT)

就变成了
程序代码:

        for(int i=0,k;i<nos;++i)
        {
            scp(ch,fls[idx[i].fi]->pth);
            srp(ch,'\\','_');
            k=gtlen(ch);
            
            if(k>20&&!scma(ch+k-20,SLK_DESTRUCT))
            {
                Df(i);
               
                int coli;
                csk=new slk (fin,ch);
               
                SEARCHTFILE,
                SEARCHTTEXFILE,
                SEARCHTPATHTEX,
                SEARCHTPATHTEXD,
                SEARCHTPORTRAIT,
               
                delete csk;
                break;
            }
        }

这样是不行的,因为SEARCHTFILE后边多了个逗号
现在问题是如何把它们后面的逗号去掉,各位大虾大神帮帮忙!

[ 本帖最后由 walkingsk 于 2011-3-31 08:45 编辑 ]
4 回复
#2
rjsp2011-03-31 09:17
去不掉,真正的错误也不在这里。

你应该将 SEARCHTFILE 等宏后面的分号去掉, 即
#define SEARCHTFILE ……;
改正为
#define SEARCHTFILE ……
#3
walkingsk2011-03-31 10:34
回复 2楼 rjsp
宏定义结尾不必有分号
SEARCHTFILE是事先定义好的宏,替换if语句
形如:
#define SEARCHTFILE \
if (XXX)
{


}
这样怎么办?
#4
rjsp2011-03-31 13:07
宏是最简单的,因为你想怎么搞都可以
程序代码:
#define SEARCH( length, arg ) \
    for( int i=0; i<length; ++i ) \
    { \
        arg \
    }

#define SEARCH_01 \
    if(1) \
    { \
    }

#define SEARCH_02 \
    if(2) \
    { \
    }

int main()
{
    SEARCH( 20, SEARCH_01 SEARCH_02 )
    /*
    展开为
    for( int i=0; i<20; ++i )
    {
        if(1)
        {
        }
        if(2)
        {
        }
    }
   
*/

    return 0;
}

#5
walkingsk2011-03-31 21:11
解决了,问题是在##__VA_ARGS__
,改成__VA_ARGS__
然后
SEEKSLK(20,SLK_DESTRUCT,SEARCHTFILE SEARCHTTEXFILE SEARCHTPATHTEX SEARCHTPATHTEXD SEARCHTPORTRAIT)
就可以了
1