我一直在使用我在网上找到的一些C代码,它在Windows 7上有编码警告和代码块,因为我正在学习C并试图理解代码作为学习过程的一部分我决定查看警告并修复它们哪里很简单,但是我修改的第一个块我觉得我理解,但如果有人能证实我的理解,将会很感激,原始的代码片段是
unsigned char buffer[MAX_PATH];
`unsigned char text_to_send[MAX_PATH];
unsigned char digits[MAX_PATH];
// example warning with digits when used as below text_to_send[m] = strtol(digits, NULL, 16);`
``
给出的警告是
警告:传递参数1的'strtol'中的指针目标在签名[-Wpointer-sign] |中有所不同
注意事项:预期'const char *'但参数类型为'unsigned char *'
警告和注释对我的理解是正确的,因为它自己使用的数字是一个指向数字[0]地址的常量指针 . 当我删除无符号声明并将它们保留为char类型时,编译器在使用这3个数组时不再发出警告 .
我的问题是,我没有理由使用无符号字符数字[MAX_PATH](或者给出类似错误的两个声明),但我错过了什么,原作者是否知道我错过了什么?
代码现在编译免费警告,看似相同,任何输入都非常感激 .
2 回答
在C语言
char
,unsigned char
和signed char
是三种不同的,不兼容的类型 . 确实,在特定实现中,char
的表示将与signed char
或unsigned char
的表示一致,但仍然不会使这些类型兼容 .反过来,这意味着,无论实现的属性如何,类型
unsigned char *
的指针都不能隐式转换为char *
类型 . 这些类型也不兼容 . 尝试执行这种隐式转换是一种约束违规,即它通常称为错误(与我们通常称之为警告的情况相反) .这就是编译器试图通过该诊断消息告诉您的内容 .
strtol()
需要char *
;你传递的是unsigned char*
. C标准说是一个香草char
是unsigned char
还是signed char
一个实现选择 . 因此编译器抱怨 .设置MS C选项以通过其/J option使用理智的[unsigned]字符是一种很好的做法