我正在使用许多字节编译低级代码.在某些情况下,我可以使用双引号括起来的旧C字符串来定义.
但是当使用gcc或g ++进行编译时(不知道其他编译器的行为),它一直困扰着我的尖头字符串.
基本上我写这篇文章的时候
const unsigned char & refok = *"ABCDEFGHI";
Run Code Online (Sandbox Code Playgroud)
编辑:好吧,上面的代码并没有真正起作用,因为它理论上只保留对字符串的第一个字符的副本的引用.实际上,由于优化,它允许使用某些编译器访问所有字符串,但可能会随时中断.
或这个
const unsigned char oktoo[10] =
{'A','B','C','D','E','F','G','H','I',0};
Run Code Online (Sandbox Code Playgroud)
编译器没有说什么.
但它绝对拒绝这一个:
const unsigned char * bad = "ABCDEFGHI";
Run Code Online (Sandbox Code Playgroud)
与消息
error: invalid conversion from
‘const char*’ to ‘const unsigned char*’
[-fpermissive]
Run Code Online (Sandbox Code Playgroud)
这甚至不是警告,这是一个错误.
我想知道为什么这个问题应该比使用引用或将单个字符从有符号字符转换为无符号字符更重要?或者我错过了什么?
我觉得你错过了很多东西!
第一行可能与您的想法完全不同.(它涉及临时转换和延长寿命.)
第二行从大括号初始化程序中的相应char初始化每个unsigned char.
在第三行中,编译器是正确的:字符串文字具有类型const char *,并且通常不能将a转换T*为a U*.
请注意,标准明确要求char,unsigned char并且signed char是不同的类型.这里的推理是char应该是平台的本机字节类型,而另外两个是显式无符号和有符号整数类型.unsigned/signed类型用于代数运算,而naked类型用于与系统连接(例如命令行参数和文件I/O).
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |