硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4766|回复: 2
收起左侧

[有问必答] mdk中st标准库的int8_t语法的疑问

[复制链接]

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2014-12-23 14:06:30 | 显示全部楼层 |阅读模式
最近在用到一个常见函数strncmp()(比较字符串)的时候碰到警告。因为strncmp中的参数是char类型。 一直以为char类型就是signed char
我的参数定义为 int8_t i[100]或者uint8_t i[100]都会收到编译器警告。提示类型不符!
st的库中int8_t 等效于 singed char; uint8_t 等效于 unsigned char; 怎么这两个都不是char类型?
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
 楼主| 发表于 2014-12-23 15:52:42 | 显示全部楼层
[paragraph]这确实是个无聊又蛋疼的问题!!!
来自身边一个朋友的答案:

对于char的定义,不同编译器认可的不一样。 VC中认为char是unsigned。
他们曾经一直使用uint8代表char,并且使用字符串函数很多年,本来是没问题的。去年换了编译器,标准字符串函数全部出错,只好更新代码,使用signed char=char。

[s:139]
百度上是这样子给出的答案:
1. char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。
C/C++中,char是C/C++整型数据中比较古怪的一个,而且关于char还有一个特殊的语言就是char *,它在C/C++中有专门的语义,既不同于signed char *,也不同于unsigned char *,专门用于指以'\\0'为结束的字符串.
在C++中
char *p="abcd"; 正确
signed char*p="abcd"; 错误!不能编译
unsigned char*p="abcd";错误!不能编译


2. 在规范的程序中,永远不要用char来定义。不然,以后移植困难!






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2014-12-23 17:23:31 | 显示全部楼层
这个问题的确比较纠结,我一般使用字符类函数都是用的char。或者使用int8_t 的话,前面加一个强制类型转换来防止警告。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 16:46 , Processed in 0.262235 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表