我得到一个"启动器在加载时是不可计算的"使用第一行代码在gcc-89中出错。 99年似乎没问题。 下面两行有什么区别?
const unsigned char BYTES[] = {0x02, "FFFEU", 0x0C, "FFFFFFFF"};
const unsigned char BYTES[] = {0x02, 0x46, 0x46, 0x46, 0x45, 0x55, 0x0C, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46};
第二行工作正常,但是查找ASCII表中的每个字符都太复杂了。
答案 0 :(得分:1)
一般来说,有两种方法可以初始化常量字符数组:(1)使用字符值初始值设定项列表进行初始化
const char bytes1[] = { 'A', 65, 0x41, 0101, 0 }; // results in a zero terminated string "AAAA"
这里,每个值都是不同代码表示中的单个字符值。
(2)用字符串文字初始化,可以选择用大括号括起来
const char bytes2[] = "AAAA";
const char bytes3[] = { "AAAA" };
这两个是等价的,都导致相同的零终止字符串。但是,只要{ "AAAA" }
语法有效并不意味着与逗号和更多值的任何组合都是有效的。
// ALL of the following are INVALID
const char bytes4[] = { "AAA", 'A' };
const char bytes5[] = { 'A', "AAA" };
const char bytes6[] = { "AA", "AA" };
现在您的问题涉及第二个主题:字符序列/字符串文字中的十六进制值。如上所示,'A'
可以在ascii中表示为十进制65
,65可以表示为十进制,八进制,十六进制,......
利用单个字符值,可能如下所示(记住bytes1
):
const char bytes7[] = { '\x41', 'A', '\101', 'A', 0 };
直接翻译成字符串文字时出现问题:
// The following is INVALID
const char bytes8[] = "\x41A\101A";
直接写入与字符串文字相同的内容是不可能的,因为在"\x41A"
中,A
将被视为十六进制序列的一部分,而不是十六进制之后的单独字符。结果值将超出字符类型的范围。这可以通过字符串文字的连接来解决:"\x41" "A"
- 只有两个文字彼此相邻,中间没有任何非空白字符。
// The following is VALID
const char bytes9[] = "\x41" "A\101A";
因此,同样的原则可适用于您的案例:
// VALID
const unsigned char BYTES[] = { "\x02" "FFFEU\x0C" "FFFFFFFF" };
十六进制序列中的前导0
并不是必需的,如上所述,大括号也是可选的。
答案 1 :(得分:0)
案例1:
const unsigned char BYTES[] = {0x02, "FFFEU", 0x0C, "FFFFFFFF"};
这里BYTES是一个const char array
,即你可以不存储任何字符(允许使用int),但是如何将strings
(“FFFEU”< - 参见双引号)存储到此中,它应该是0xFFFEU
或'FFFEU'
修改为
const unsigned char BYTES[] = {0x02, 0xFFFEU, 0x0C, 0xFFFFFFFF};
但是你再次无法将big data(0xFFFEU)
存储在1 byte memory
中,编译器可能不会给error
,但它会overwrite
其他字节,所以你不会得到预期结果