C语言多字符常量赋值uint64_t的GCC警告及sizeof(char)疑问
问题分析与解答
问题背景
编写代码:
static uint64_t password = 'password';
GCC给出警告:
warning: character constant too long for its type static uint64_t password = 'password';
修改为:
static uint64_t password = 'pass';
GCC提示:
warning: multi-character character constant [-Wmultichar] static uint64_t password = 'pass';
由此产生疑问:难道sizeof(char)等于2?实际情况是否如此?
核心结论
sizeof(char)永远等于1,这是C标准强制规定的,和平台无关。你遇到的警告和char的大小没有直接关系,问题出在多字符常量的特性上。
详细解释
多字符常量的本质
C语言允许用单引号包裹多个字符形成多字符常量(比如'pass'),但这种行为是实现定义的,不属于标准强制要求。在GCC中,多字符常量会将每个字符的ASCII值按字节拼接,最终转换为int类型的值(注意:字符常量的类型是int,不是char)。警告原因拆解
- 第一个代码中,
'password'包含8个字符,远超过了int类型的字节长度(通常int是4字节),所以GCC提示“字符常量过长”。 - 第二个代码中,
'pass'刚好是4个字符,和int的字节长度匹配,但GCC仍会触发-Wmultichar警告,目的是提醒你:多字符常量的解析规则依赖编译器,代码移植性差,不推荐使用。
- 第一个代码中,
关于
sizeof(char)的误区
你之所以会误以为sizeof(char)等于2,可能是混淆了多字符常量的类型和char的大小。多字符常量的类型是int,所以sizeof('pass')等价于sizeof(int),而不是4 * sizeof(char)(虽然数值上可能相同,但逻辑上完全是两回事)。C标准明确规定sizeof(char)必须为1,这是语言的基础特性。
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

