编译器警告,已修复,但我想确保理解

时间:2013-12-03 02:44:10

标签: c windows gcc codeblocks

我一直在使用我在网上找到的一些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);

unsigned char text_to_send[MAX_PATH]; unsigned char digits[MAX_PATH];

给出的警告是

警告:传递'strtol'参数1的指针目标在签名方面有所不同[-Wpointer-sign] |

带注释 注意:预期'const char *'但参数类型为'unsigned char *'

警告和注释对我的理解是正确的,因为它自己使用的数字是指向数字[0]地址的常量指针。当我删除无符号声明并将它们保留为char类型时,编译器在使用这3个数组时不再发出警告。

我的问题是我没有理由使用无符号字符数字[MAX_PATH](或两个声明给出类似错误的声明),但是我错过了什么,原作者是否知道我错过了什么?

现在代码编译免费警告,看似相同,任何输入都非常感激。

2 个答案:

答案 0 :(得分:2)

在C语言char中,unsigned charsigned char是三种不同的,不兼容的类型。确实,在特定实现中,char的表示将与signed charunsigned char的表示一致,但仍然不会使这些类型兼容。

反过来,这意味着,无论实现的属性如何,类型unsigned char *的指针都不能隐式转换为类型char *。这些类型也不兼容。尝试执行此类隐式转换是约束违规,即它通常称为错误(与我们通常称为警告相反) EM>)。

这就是编译器试图通过该诊断消息告诉您的内容。

答案 1 :(得分:0)

strtol()需要char *;你传递的是unsigned char*。 C标准说,香草charunsigned char还是signed char实施选择。因此编译器抱怨。

优良作法是将MS C选项设置为通过其/J option

使用合理的[unsigned]字符