| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 284 人关注过本帖
标题:一个关于可变参数宏的问题,求高人指点
只看楼主 加入收藏
walkingsk
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-11-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
一个关于可变参数宏的问题,求高人指点
首先,代码里的
程序代码:
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 编辑 ]
搜索更多相关主题的帖子: color 
2011-03-31 08:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:0 
去不掉,真正的错误也不在这里。

你应该将 SEARCHTFILE 等宏后面的分号去掉, 即
#define SEARCHTFILE ……;
改正为
#define SEARCHTFILE ……
2011-03-31 09:17
walkingsk
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-11-9
收藏
得分:0 
回复 2楼 rjsp
宏定义结尾不必有分号
SEARCHTFILE是事先定义好的宏,替换if语句
形如:
#define SEARCHTFILE \
if (XXX)
{


}
这样怎么办?
2011-03-31 10:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9026
专家分:54030
注 册:2011-1-18
收藏
得分:20 
宏是最简单的,因为你想怎么搞都可以
程序代码:
#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;
}

2011-03-31 13:07
walkingsk
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-11-9
收藏
得分:0 
解决了,问题是在##__VA_ARGS__
,改成__VA_ARGS__
然后
SEEKSLK(20,SLK_DESTRUCT,SEARCHTFILE SEARCHTTEXFILE SEARCHTPATHTEX SEARCHTPATHTEXD SEARCHTPORTRAIT)
就可以了
2011-03-31 21:11
快速回复:一个关于可变参数宏的问题,求高人指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019304 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved