C 通过头文件中的宏定义数组
我想问一下这个代码C 通过头文件中的宏定义数组,c,arrays,macros,header,initialization,C,Arrays,Macros,Header,Initialization,我想问一下这个代码 #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*
#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;
}
#包括
#包括“位数组.h”
#ifndef位数组
#定义位数组(数组名称、大小)\
int size_in_bits=大小/sizeof(长)/*由于这一点,它应该在x64上工作*/\
大小(单位:位)/=8/*从字节到位的转换*/\
int数组_名称[大小(单位:位)]/*数组的声明*/\
对于(int i=0;i
据我所知,这个宏位数组(array_name,size)(放在单独的头文件bit array.h中)应该定义并用零填充数组,然后它应该将零打印到终端中。
但是,它会从内存中打印一些随机数。我被困在这里了。你能帮忙吗
编辑:谢谢你的回答。我必须道歉,我忘了在这里写一件重要的事。这就是事实,在这个任务中,这必须是带有原型的宏:BitArray(数组名称,大小)。我会使用这个:
#include <limits.h>
#define bit_array(type, varname, nbits) \
type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
最好使用无符号整数类型作为数组的基类型。我将使用以下方法:
#include <limits.h>
#define bit_array(type, varname, nbits) \
type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
最好使用无符号整数类型作为数组的基类型。我将使用以下方法:
#include <limits.h>
#define bit_array(type, varname, nbits) \
type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
最好使用无符号整数类型作为数组的基类型。我将使用以下方法:
#include <limits.h>
#define bit_array(type, varname, nbits) \
type varname[((nbits) + CHAR_BIT + sizeof(type) - 1) / (CHAR_BIT * sizeof(type))]
最好使用无符号整数类型作为数组的基类型。您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个
但是,这段代码还有其他各种问题…您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个
但是,这段代码还有其他各种问题…您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个
但是,这段代码还有其他各种问题…您正在创建一个(size/8)元素数组,其中size==100,但随后打印出100个元素,而不是12个
这段代码还有很多其他的问题,尽管…按照您编写宏的方式,您最好将它变成一个函数并将其标记为内联。幸运的是,你不需要那么复杂 Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:
#include <limits.h>
#define BitArray( type, varname, nbits ) \
type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*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;
}
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}
按照您编写宏的方式,您最好将其作为函数并标记为内联。幸运的是,你不需要那么复杂
Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:
#include <limits.h>
#define BitArray( type, varname, nbits ) \
type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*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;
}
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}
按照您编写宏的方式,您最好将其作为函数并标记为内联。幸运的是,你不需要那么复杂
Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:
#include <limits.h>
#define BitArray( type, varname, nbits ) \
type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*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;
}
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}
按照您编写宏的方式,您最好将其作为函数并标记为内联。幸运的是,你不需要那么复杂
Kerrek的答案非常接近,但其中有一个缺陷,如果对类型使用无符号字符,可以看到这个缺陷,而且它不完整,因为它没有用0填充数组。因此,更正确和完整的答案是:
#include <limits.h>
#define BitArray( type, varname, nbits ) \
type varname[ ( (nbits) + ( CHAR_BIT * sizeof(type) ) - 1 ) / ( CHAR_BIT * sizeof(type) ) ] = {0};
#包括
#定义位数组(类型、变量名、nbits)\
类型varname[((nbits)+(CHAR_位*sizeof(type))-1)/(CHAR_位*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;
}
intmain()
{
位数组(uint32_t,test,100);//与uint32_t test[4]相同={0};
对于(int i=0;i<4;i++)
printf(“%d\n”,test[i]);
返回0;
}
大小(单位:位)
不是100。并使用memset
清除memory@KerrekSB:您似乎忘记了可变长度数组、VLA、C99中的标准值和C11中的可选值。@JonathanLeffler:没错,但是OP发布的构造不必要地使用动态绑定,因为绑定是静态可用的。我发布的解决方案仍然可以用于创建VLA。我主要反对中间变量…size_