size_t必须typedef为标准无符号整数类型吗?能否用定宽类型?
C11中
size_t类型定义的常见疑问解答 核心结论
size_t必须是现有无符号整数类型的别名,不能是完全独立的新类型;它可以被定义为<stdint.h>里的指定宽度整数类型(比如uint32_t),但前提是这个指定宽度类型本身也是标准无符号整数类型的typedef。
1. size_t能不能定义成<stdint.h>里的指定宽度整数类型(如uint32_t)?
当然可以。因为<stdint.h>中的指定宽度整数类型(像uint32_t)本质上就是标准无符号整数类型的typedef——比如uint32_t可能是unsigned int或者unsigned long的别名,具体取决于实现的硬件平台。只要该指定宽度类型的取值范围能装下sizeof运算符的结果,实现就可以把size_ttypedef成它。
2. size_t必须是五种标准无符号整数类型的typedef吗?
准确来说,它必须是标准无符号整数类型或扩展无符号整数类型的typedef。C11允许实现定义扩展无符号整数类型(属于6.2.5规定的整数类型范畴),不过绝大多数实现都会直接从五种标准无符号类型里选一个来定义size_t,毕竟扩展类型不是强制要求的。
另外,C标准的修订理由里明确提到:size_t必须是现有无符号整数类型的别名,不能是全新的独立类型。
3. size_t能不能是完全独立的类型?
绝对不行。根据C11 7.19的规定,size_t是一种“无符号整数类型”,而C11里所有整数类型都属于6.2.5定义的范畴(要么是标准类型,要么是扩展类型)。再加上size_t是通过typedef定义的(从typedef /*implementation-defined*/ size_t;的声明形式就能看出来),这意味着它只能是现有整数类型的别名,不可能是全新的独立类型。
4. 答案对应的标准条款依据
- C11 6.2.5 类型:
- 第4款:明确了五种标准有符号整数类型及其对应的无符号版本;
- 第5款:允许实现定义扩展有符号/无符号整数类型,这些类型属于整数类型的范畴。
- C11 7.19 <stddef.h> 通用定义:
- 第1-2款:指定
size_t是sizeof运算符结果的无符号整数类型。
- 第1-2款:指定
- C标准修订理由:直接指出
size_t必须是现有无符号整数类型的别名,而非独立类型。 - C11 7.20.1.1 指定宽度整数类型:规定指定宽度无符号整数类型是标准或扩展无符号整数类型的typedef。
内容的提问来源于stack exchange,提问作者Lover of Structure
相关产品推荐
相关产品推荐

