【问题标题】:C and C++ difference in sizeof('x') [duplicate]C 和 C++ 在 sizeof('x') 方面的差异
【发布时间】:2011-04-10 00:14:39
【问题描述】:

可能重复:
Why are C character literals ints instead of chars?

为什么在使用 C 时 sizeof('x') 返回 4 而在 C++ 中 sizeof('x') 返回 1?

C++ 通常力求成为 C 的超集,那么为什么这两个结果会不同呢?

编辑 只是一些进一步的澄清。这似乎是标准委员会有意采取的举措,我认为如果没有充分的理由,就不会更改“x”的大小。我对原因很感兴趣。

【问题讨论】:

标签: c++ c


【解决方案1】:

引用 C++ 标准 ISO 14882:2003,附件 C.1.1 第 2.13.2 条

更改:字符字面量的类型由 int 更改为 char

基本原理:这是改进重载函数参数类型匹配所必需的。例如:

int function( int i );
int function( char c );
function( ’x’ );

这个调用最好匹配第二个版本的函数而不是第一个

(附件 C 描述了 C 和 C++ 之间的不兼容性)

【讨论】:

  • 或多或少和我想的一样,但黑白照片很好看。
  • 当然,他们可能刚刚引入了“charliteral”语法——例如C'x'的类型为char,与@987654325相同@ 是 wchar_t 类型。
  • 注意,多字符文字,例如'abcd' 仍然是类型为int,具有实现定义的值。
【解决方案2】:

C++ 不是 C 的超集。特别是如果您使用“当前”版本 - C++0x 模式下的编译器会阻塞 C99 代码。

【讨论】:

  • 但那是因为(当时)新的 C99 标准没有并入 C++
  • @deus-ex C99 在 C++0x 开始之前已经存在多年。如果他们想让 C 成为一个子集,他们就会包含这些更改。事实上,他们确实包括其中一些。 #include <cstdint>指的是C99的stdint.h
  • C 和 C++ 与最新版本的标准略有不同。就通用特性集而言,我不希望 C99 被引入 C++0x,反之亦然。
【解决方案3】:

因为是 C,'x' 实际上是一个 int,而在 C++ 中它是一个 char。

C++ 尝试加强在 C 中有点松懈的强类型化。

【讨论】:

  • 有趣的行为......我不是一个 C 人,但这让我感到惊讶。因此,当您调用printf("%c", 'x'); 时,4 个字节被压​​入堆栈用于可变参数,但在 C++ 中它只会是 1 个字节?考虑到 CRT 不知道调用它的语言,这怎么可能?
  • @tenfour,不——C++ 中也推送了 4 个字节。可变参数调用有很多类型提升规则。
  • @tenfour:在 C++ 中,可变参数总是经过整数提升,这意味着 charshort 类型在传递给可变参数函数之前总是被提升为 [unsigned] int。同样的事情发生在 C 中。
  • 每天学习一些东西 :) 现在我想知道为什么 char 文字是 C 中的 int
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多