确定变量的类型并在sizeof()中使用它

C++ Determine the type of a variable and use it within sizeof()

本文关键字:sizeof 变量 类型      更新时间:2023-10-16

我想用c++写一个宏,它会给表的每个元素赋值0。例如,将i声明为:int i[10];,宏fill_with_zeros(i)将产生如下效果:

i[0] = 0;

i[1] = 0;等。

这是它的代码:

#define fill_with_zeros(xyz) 
    for(int l = 0 ; l < sizeof(xyz) / sizeof(int) ; l++) 
        xyz[l] = 0;

问题是,我希望它工作与多种类型的表:char, int, double等。为此,我需要一个函数来确定xyz的类型,这样我就可以使用sizeof(typeof(xyz))来代替sizeof(int)

存在类似的线程,但人们通常希望打印类型名称,而我需要在sizeof()中使用名称。有什么办法吗?

Thanks in advance

为什么你认为你需要一个宏?这应该可以工作:

// Beware, brain-compiled code ahead!
template< typename T, std::size_t sz >
inline void init(T (&array)[sz])
{
  std::fill( array, array+sz, T() );
}

我希望我的std库实现优化std::fill(),在T允许的情况下自己调用std::memset()(或类似的东西)。

注意,这实际上并没有将元素归零,而是使用默认构造的对象进行初始化。这对所有可以归零的类型都实现了相同的效果,并且可以处理许多不能归零的类型。

为什么不用memset(xyz, 0, sizeof(xyz));呢?

对于所有内置类型(整型和浮点型),0 = 0。

数组的长度可以确定为sizeof(xyz) / sizeof(xyz[0])。但是,已经有ZeroMemorymemset函数可以做您想做的事情。

#define fill_with_zeroes(arr) 
    for (int l = 0; l < sizeof(arr) / sizeof(arr[0]); l++) 
        arr[l] = 0;

或者直接调用memset(arr, 0, sizeof(arr));

我建议使用memset或者int I [10] = {0};

为什么不直接使用<cstring>中的std::memset呢?这就是它的设计目的,并且在大多数情况下工作得更快。

int i[10];
memset (i, 0, sizeof (i));

您应该像其他人建议的那样使用memset,但如果您真的想走宏路线:

#define fill_with_zeros(xyz) 
for(size_t l = 0 ; l < sizeof(xyz) / sizeof(xyz[0]) ; l++) 
    xyz[l] = 0;