在头文件中按宏定义数组

问题描述 投票:0回答:3

我想问你这个代码

#include <stdio.h>
#include "bit-array.h"

#ifndef BitArray
#define BitArray(array_name, size)\
    int size_in_bits = size/sizeof(long);/*thanks to this, it should work on x64*/\
    size_in_bits /= 8;/*conversion from bytes to bits*/\
    int array_name[size_in_bits];/*declaration of an array*/\
    for(int i = 0; i < size_in_bits; i++)/*filling the array by zeros*/\
        array_name[i] = 0;\

#endif

int main()
{
    BitArray(test, 100);
    for(int i = 0; i < 100; i++)
        printf("%d\n", test[i]);
    return 0;
}

据我所知,这个宏BitArray(array_name,size)(放在单独的头文件bit-array.h中)应该用零来定义和填充数组,然后它应该将零打印到终端。但是,它会从内存中打印一些随机数。我有点被困在这里。你能帮帮忙吗?

编辑:谢谢你的所有答案。我必须道歉,我忘了在这里写一件重要的事情。事实上,在这个任务中,这个原型必须是宏:BitArray(array_name,size)。

c arrays macros header initialization
3个回答
2
投票

你正在创建一个(size / 8)元素的数组,其中size == 100,但是然后打印出100个元素,而不是12个元素。

这段代码有各种其他问题,但......


1
投票

我用这个:

#include <limits.h>
#define bit_array(type, varname, nbits) \
    type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]

用法:

bit_array(unsigned int, foo, 120);    // maybe "unsigned int foo[4];"

您最好使用无符号整数类型作为数组的基本类型。


0
投票

你编写这个宏的方式,你最好只是将它作为一个函数并将其标记为内联。幸运的是,你不需要那么复杂。

Kerrek的答案非常接近,但是它有一个缺陷,如果你对类型使用unsigned char,你可以看到它,并且它不完整,因为它没有用0填充数组。所以更正确和完整的答案是:

    #include <limits.h>
    #define BitArray( type, varname, nbits ) \
        type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};

因此你的程序变成:

    int main()
    {
        BitArray( uint32_t, test, 100 );  // same as uint32_t test[4] = {0};
        for ( int i = 0; i < 4; i++ )
            printf("%d\n", test[i]);
        return 0;
    }
© www.soinside.com 2019 - 2024. All rights reserved.