【问题标题】:Quoted initializer for unsigned char array in CC中无符号字符数组的带引号的初始化程序
【发布时间】:2015-10-18 03:52:58
【问题描述】:

这似乎在 GCC 和 Visual C 中有效,无需注释:

static const **unsigned** char foo[] = "bar";

这是用于单元测试的盐。还有其他方法可以做到这一点,但这是最简单的,并且涉及的成本最低。

这会对其他编译器造成麻烦吗?

【问题讨论】:

  • 你在担心什么,为什么会造成麻烦?
  • @Claris:因为字符串文字表示(普通)char 的数组。通常你不能使用char 的数组来初始化unsigned char 的数组——但是有一个明确的规则允许这样做。

标签: c char unsigned initializing


【解决方案1】:

这是安全的,至少如果您使用的是符合标准的 C 编译器。

N1570 6.7.9 第 14 段说:

字符类型的数组可以由字符串初始化 文字或 UTF-8 字符串文字,可选择用大括号括起来。 字符串文字的连续字节(包括终止的 null 如果有空间或数组大小未知,则字符) 初始化数组的元素。

C90 标准的措辞基本相同,因此您无需担心较旧的编译器。

字符类型charsigned charunsigned char

有趣的是,指针初始化没有相应的保证,所以这样:

const char *ptr = "hello";

是安全的,但是这个:

const unsigned char *uptr = "hello";

不是——而且似乎没有简单的解决方法。

【讨论】:

  • 舌尖上:指针应该是const,因为它们指向的字符串是常量。但是修复这个微不足道的遗漏并不能解决你正在解决的问题。
  • (const unsigned char *)"hello" 将是一个简单的解决方法
  • @MattMcNabb:可能。它确实依赖于关于charunsigned char 表示的一些假设,但我认为这些假设是由标准中的保证所证明的。 (不过感觉有点恶心。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多