【问题标题】:Defining array by macro in header file在头文件中通过宏定义数组
【发布时间】:2014-03-11 23:52:44
【问题描述】:

我想请教一下这段代码

#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)。

【问题讨论】:

  • size_in_bits 不是 100. 并使用memset 清除内存
  • @KerrekSB:您似乎忘记了可变长度数组、VLA、C99 中的标准和 C11 中的可选。
  • @JonathanLeffler:确实如此,但是当绑定静态可用时,OP 发布的构造是不必要地使用动态绑定。我发布的解决方案仍可用于创建 VLA。我主要反对中间变量...

标签: c arrays macros header initialization


【解决方案1】:

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

此代码还有其他各种问题...

【讨论】:

    【解决方案2】:

    我会用这个:

    #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];"
    

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

    【讨论】:

      【解决方案3】:

      按照您编写该宏的方式,最好将其设为函数并将其标记为内联。幸运的是,您不需要那么复杂。

      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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 2022-12-21
        • 1970-01-01
        相关资源
        最近更新 更多