【问题标题】:Compiler warnings, fixed but would like to make sure I understand编译器警告,已修复,但想确保我理解
【发布时间】:2013-12-03 02:44:09
【问题描述】:

我一直在使用我在网上找到的一些 C 代码,这些代码在 Windows 7 上有带有代码块的编译器警告,因为我正在学习 C 并尝试理解代码作为学习过程的一部分,我决定查看警告并修复它们有一些足够简单,但是我修复的第一个块我想我理解,但如果有人能证实我的理解,将不胜感激,有问题的原始代码 sn-p 是

unsigned char buffer[MAX_PATH];

unsigned char text_to_send[MAX_PATH];

unsigned char digits[MAX_PATH];

// 如下使用数字警告示例

text_to_send[m] = strtol(digits, NULL, 16);

给出的警告是

警告:传递“strtol”参数 1 的指针目标在符号上不同 [-Wpointer-sign]|

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

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

我的问题是我看不出有理由使用 unsigned char digits[MAX_PATH] (或者对于给出类似错误的两个声明),但是我错过了什么,原作者知道我错过了什么吗?

现在的代码编译时没有警告并且工作起来看起来一样,任何输入都非常感谢。

【问题讨论】:

  • unsigned char text_to_send[MAX_PATH]; text_to_send[m] = strtol(digits, NULL, 16); 那不发出警告吗? “无符号字符 = 长”?
  • 不,它没有给出错误,但我明白你的意思,我也会看看那个,它不可能是正确的。感谢您指出这一点。

标签: c windows gcc codeblocks


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    strtol() 接受char *;你传递给它一个unsigned char*。 C 标准规定,香草 charunsigned char 还是 signed char 是一种实现选择。因此编译器会发牢骚。

    最好通过 /J option 将您的 MS C 选项设置为使用健全的 [无符号] 字符

    【讨论】:

    • 对不起,应该提到将 gcc 与代码块一起使用,我明白为什么会出现警告,我的问题是你为什么要首先声明它是无符号的。
    • 因为char 是一个整数。例如,用作数组索引的signed char 会导致高于 0x7F 的代码点出现问题,因为它将是数组的负索引,从而导致内存损坏或访问冲突。为了可移植性和尽量减少不必要的问题,明确声明您的 char 类型为“有符号”或“无符号”。
    • 谢谢,我想我明白了。
    • 无论如何,还是charsigned charunsigned char是三种不同的类型,互不兼容。即使在char 未签名的实现中,char 仍被认为与unsigned char 不兼容。这意味着无论实现如何,char *unsigned char * 都是不兼容的指针类型,不能混用。
    猜你喜欢
    • 2013-10-28
    • 2020-05-29
    • 2012-12-31
    • 2017-04-16
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多