【发布时间】:2014-06-03 10:34:32
【问题描述】:
我正在使用一些嵌入式代码并且我正在从头开始编写一些新的东西,所以我更喜欢坚持使用 uint8_t、int8_t 等类型。
但是,当移植一个函数时:
void functionName(char *data)
到:
void functionName(int8_t *data)
将文字字符串传递给函数时,我收到编译器警告“在指向具有不同符号的整数类型的指针之间转换”。 (即当调用functionName("put this text in"); 时)。
现在,我明白为什么会发生这种情况,这些行只是调试,但我想知道人们认为最合适的处理方式是什么,而不是对每个文字字符串进行类型转换。在实践中,我不觉得笼统的类型转换比使用像“char”这样潜在的模棱两可的类型更安全。
【问题讨论】:
-
如果你想停止使用
char那你为什么要写字符串文字?我认为试图假装char不存在是毫无意义的。你需要正视它。 -
数据的用途是什么?如果是文本,使用
char,如果是数字数据,使用u/int8_t。 -
感谢 cmets,字符串文字是调试输出,例如“达到某个点”这些定义确实不同,这里它们是 typedef 的(在我看来正确为:typedef signed char int8_t ; typedef unsigned char uint8_t; 顺便说一句,使用“signed char”而不是“char”也会产生相同的编译器警告。
-
@user694733 如果是字符数据,使用
char;如果是数字数据,请使用signed char,如果是原始内存(或位掩码等),请使用unsigned char。只有极少数情况下,如果有的话,int8_t或uint8_t是合适的。 (对于初学者来说,并非所有系统都支持它们。) -
@JamesKanze - 您的 cmets 对于在每个系统都有一些 x86 兼容处理器的操作系统上运行的软件有效。然而,嵌入式处理器之间代码的可移植性(想想我们在过去五年中都从 8 位 PIC 迁移到 32 位 ARM)。在这种情况下,您已经准确定义了每次声明需要多少位,您可以通过简单地使用适当的 stdint.h 文件来维护它。