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

vc 可以在数组定义里面使用宏么

Vincent800 发布于 2018-02-02 17:56, 3002 次点击
#define SETBYTE ???

UCHAR data[10] = {SETBYTE(2,5), SETBYTE(3,0), SETBYTE(3,0xa), SETBYTE(2,4)};


就是定义数组为{5,5,0,0,0,0xa,0xa,0xa,4,4};
想搞个通用的宏,数组比较大时就很方便了
6 回复
#2
stop12042018-02-03 08:49
你还不如写个 vector, 然后用一个类或者函数来实现.
数组的话,除非你确定你只初始化一次, 不然你写的类或者函数 要重定义数组大小来适应新加入的元素数量


#3
stop12042018-02-03 08:58
程序代码:

    xx(vector<int>& vec,int i1,int i2){
        for(int i=0;i<i1;++i)
            vec.push_back(i2);
    }



程序代码:

int main() {
vector<int> vec;
xx (vec,2,5),xx (vec,3,0),xx (vec,3,0xa);  //十六进制 输出的话是十进制显示,   如果你想显示成 0xXXX 你就得换成 Vector<string>
    return 0;
}
#4
Vincent8002018-02-03 12:39
谢谢,只能用函数来解决了

#define SETBYTE(n,d) n,(UCHAR)d

    //////////////////////////////////////////////////////////////////////////
    // 初始化数组,不作越界检测
    VOID InitData(UCHAR* data, ...)
    {
        STRUCT(_setbyte)
        {
            INT n;
            INT d;
        };
        vector<_setbyte> vec_sb;
        vec_sb.clear();
        _setbyte sb;

        va_list marker;

        va_start( marker, data );     /* Initialize variable arguments. */
        do
        {
            sb.n = va_arg(marker, INT);
            sb.d = va_arg(marker, INT);
            //Output::DbgStr(TEXT("%p,%p"), sb.n, sb.d);

            if (sb.n>0 && sb.n<100000 && sb.d<256)
                vec_sb.push_back(sb);
            else
                break;
        } while (TRUE);
        va_end( marker );              /* Reset variable arguments.      */

        UINT nPos = 0;
        vector<_setbyte>::iterator psb = vec_sb.begin();
        while (psb != vec_sb.end())
        {
            //Output::DbgStr(TEXT("%p,%02x"), psb->n, psb->d);
            FillMemory(data+nPos, psb->n, psb->d);
            nPos += psb->n;
            //
            psb++;
        }
    }


    //////////////////////////////////////////////////////////////////////////
    UCHAR data[16];
    Common::InitData(data, SETBYTE(2,6), SETBYTE(3,4), SETBYTE(4,8), SETBYTE(1,9), SETBYTE(sizeof(data)-10,0xb));
    TCHAR buffer[100];
    for (int i=0; i<16; i++)
    {
        StringCchPrintf(buffer+i*3, 4, TEXT("%02x "), data[i]);
    }
    Output::DbgStr(buffer);


只有本站会员才能查看附件,请 登录
#5
Vincent8002018-02-03 13:01
可变参数的函数,不知怎么获取参数个数,我只好这样来判断了

            if (sb.n>0 && sb.n<100000 && sb.d<256)
                vec_sb.push_back(sb);
            else
                break;

可算个bug了
#6
stop12042018-02-06 07:40
回复 5楼 Vincent800
我记得  ... 就是可变参数


参考http://blog.

[此贴子已经被作者于2018-2-6 07:42编辑过]

#7
Vincent8002018-02-07 00:38
回复 6楼 stop1204
好的
我看了,我就是弄不懂第4点中,循环退出的条件
1