我正在使用许多字节编译低级代码。在某些情况下,我可以使用双引号括起旧的C字符串来定义。
但是当用gcc或g ++进行编译时(不知道其他编译器的行为),它一直困扰着我的尖头字符串。
基本上我写这个
const unsigned char & refok = *"ABCDEFGHI";
编辑:好的,上面的代码并没有真正起作用,因为理论上它只会保留对字符串第一个字符的副本的引用。实际上,由于优化,它允许使用某些编译器访问所有字符串,但可能会随时中断。
或者
const unsigned char oktoo[10] =
{'A','B','C','D','E','F','G','H','I',0};
编译器没有说什么。
但它绝对拒绝这一个:
const unsigned char * bad = "ABCDEFGHI";
带有消息
error: invalid conversion from
‘const char*’ to ‘const unsigned char*’
[-fpermissive]
这甚至不是警告,而是错误。
我想知道为什么这个问题比使用引用或将单个字符从有符号字符转换为无符号字符更重要?或者我错过了什么?
答案 0 :(得分:8)
我认为你错过了很多的东西!
第一行可能会与您的想法完全不同。 (它涉及临时转换和延长寿命。)
第二行从大括号初始化程序中的相应char初始化每个unsigned char。
在第三行中,编译器是正确的:字符串文字的类型为const char *
,并且通常无法将T*
转换为U*
。
请注意,标准明确要求char
,unsigned char
和signed char
为不同的类型。这里的推理是char
应该是平台的本机字节类型,而其他两个是显式无符号和有符号整数类型。 unsigned / signed类型用于代数运算,而naked类型用于与系统连接(例如命令行参数和文件I / O)。
答案 1 :(得分:4)
允许数值类型之间的隐式转换;这就是前两个人正在做的事情。不允许在不同指针类型之间进行隐式转换(除了将派生类指针转换为基类指针之外)。
请注意,第一个不提供对数组的第一个字符的引用。它创建该角色的临时副本,转换为类型unsigned char
,并将引用绑定到该类型,将临时的生命周期延长到引用的生命周期。
第二个将初始化列表中的每个char
转换为unsigned char
数组元素。
第三次尝试将const char *
转换为const unsigned char *
;由于char
和unsigned char
是不同的类型,因此不允许隐式指针转换。