C中无符号字符数组的带引号的初始值设定项

C中无符号字符数组的带引号的初始值设定项,c,char,unsigned,initializing,C,Char,Unsigned,Initializing,这似乎可以在GCC和Visual C中正常工作,无需说明: static const **unsigned** char foo[] = "bar"; 这是一种用于单元测试的盐。有其他方法可以做到这一点,但这是最简单的,涉及到最少的下线 这会给其他编译器带来麻烦吗?这是安全的,至少如果您使用的是符合标准的C编译器 6.7.9第14段规定: 字符类型的数组可以由字符串初始化 文字或UTF−8字符串文字,可选地用大括号括起来。 字符串文本的连续字节(包括终止null 字符(如果有空间或数组大小未知

这似乎可以在GCC和Visual C中正常工作,无需说明:

static const **unsigned** char foo[] = "bar";
这是一种用于单元测试的盐。有其他方法可以做到这一点,但这是最简单的,涉及到最少的下线


这会给其他编译器带来麻烦吗?

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

6.7.9第14段规定:

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

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

字符类型有
char
signed char
unsigned char

有趣的是,指针初始化没有相应的保证,因此:

const char *ptr = "hello";
是安全的,但是:

const unsigned char *uptr = "hello";

不是--而且似乎没有简单的解决办法。

您担心什么,为什么会引起麻烦?@Claris:因为字符串文字表示(普通)
char
的数组。通常,您无法使用
char
数组来初始化
无符号char
数组,但有一条明确的规则允许这样做。开玩笑地说:指针应该是
const
,因为它们指向的字符串是常量。但是,修复这一微不足道的遗漏并不能解决您所面临的问题。
(const unsigned char*)“hello”
将是一个简单的问题workaround@MattMcNabb:大概吧。它确实依赖于关于
字符
无符号字符
表示的一些假设,但我认为这些假设是由标准中的保证证明的。(不过感觉有点恶心。)