You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的大小没有直接关系,问题出在多字符常量的特性上。

详细解释

  1. 多字符常量的本质
    C语言允许用单引号包裹多个字符形成多字符常量(比如'pass'),但这种行为是实现定义的,不属于标准强制要求。在GCC中,多字符常量会将每个字符的ASCII值按字节拼接,最终转换为int类型的值(注意:字符常量的类型是int,不是char)。

  2. 警告原因拆解

    • 第一个代码中,'password'包含8个字符,远超过了int类型的字节长度(通常int是4字节),所以GCC提示“字符常量过长”。
    • 第二个代码中,'pass'刚好是4个字符,和int的字节长度匹配,但GCC仍会触发-Wmultichar警告,目的是提醒你:多字符常量的解析规则依赖编译器,代码移植性差,不推荐使用。
  3. 关于sizeof(char)的误区
    你之所以会误以为sizeof(char)等于2,可能是混淆了多字符常量的类型和char的大小。多字符常量的类型是int,所以sizeof('pass')等价于sizeof(int),而不是4 * sizeof(char)(虽然数值上可能相同,但逻辑上完全是两回事)。C标准明确规定sizeof(char)必须为1,这是语言的基础特性。


内容的提问来源于stack exchange,提问作者Penguin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:03:14