我对 C 中的函数有疑问sizeof
。我想编写一些函数来获取给定类型的位大小。我是一个新手,对 C 的经验很少,所以我想知道我是否想要一个以下结构,我的输入类型应该是什么?
int bits( /*what TYPE goes here?*/ input ) {
return (8*sizeof( input ));
}
如您所见,我的输入直接传递给 sizeof,那么我应该将哪种类型传递给我的函数原型以使其正常工作?
C 是静态类型的,因此您不能将类型传递给函数。没有办法用函数来做到这一点。但是当您使用类似函数的宏时它会起作用:
#define bits(type) (8*sizeof(type))
printf ("The type 'int' is %zu bits wide\n", bits(int));
术语 nit pick:sizeof
不是函数;它是一个运算符。当参数是表达式时,您可以不使用括号使用它,如
int i;
size_t j = sizeof i;
另请注意,乘以 8 是一个可能错误的假设。对于这些天您可以购买的任何东西,这是一个安全的赌注,但是当内存以千字节(= 1024 :-) 测量时,有一些奇怪的野兽,这是不正确的。C 标准还谈到了可能使问题进一步复杂化的填充位,但我从未在野外见过。
sizeof
不是函数,而是运算符。此外,它被评估为编译时常量而不是运行时变量。它采用类型名称或表达式的操作数,但在后一种情况下,它是计算表达式结果的类型的大小。
请注意,虽然在大多数平台上将大小乘以 8 会产生位大小,但并非所有平台都如此(例如,TI TMS320C55x DSP 具有 16 位字符类型)。更安全的方法是使用标准 limits.h 头文件中定义的 CHAR_BIT 宏。
您可以创建一个宏来评估位大小:
#include <limits.h>
#define bit_sizeof(t) (CHAR_BIT * sizeof(t) )
与 sizeof 一样,此宏可以采用类型名称或变量参数,这是函数无法做到的。
sizeof
用于计算任何数据类型的大小。您可以传递原始数据类型(如 anint
或 a )float
或用户定义的数据类型(如struct
.
sizeof
运算符可用于任何数据类型,但不能用于函数类型或位域左值。
您可以拥有任何类型(函数中定义的原始类型或用户类型)