C 中的类型冲突,为什么?

2023-12-12

我正在尝试使用 C 语言编写基本实践,使用二进制和十六进制。我制作了一个打印 2 的倍数(2 的幂)的方法和一个单独的方法来打印 2 的倍数的十六进制形式。

#include <stdlib.h>
#include <stdio.h>

const char one = 1;
const int bits = 31;

void    print2       ()
{
    unsigned int  u = (int)one;
    unsigned int j;

    printf("The powers of 2 are:\n");

    for(j=0;j<bits;j++)
    {
            unsigned int temp = u<<j;
            printf("%d\n",abs(temp));
            printhex(temp);
    }

    printf("\n\n");
}

void    printhex       (unsigned int   u)
{
    printf("0x%08X\n",u);
}

int main ()
{
    print2();
    return(EXIT_SUCCESS);
}

我不明白的是为什么我在调用方法“printHex”时收到错误“冲突类型”。我特别要求一个无符号整数,当我在参数中调用该方法时(我假设它是无符号整数“temp”),编译器不接受。


你遇到问题是因为你没有提供原型printhex()在你使用它之前。

要么放printhex()身体之前print2()在源文件中,或添加声明:

extern void printhex(unsigned int u);

before print2()被定义为。 (不要声明printhex() inside print2();尽管它在语法上是合法的,但这样做是不好的做法。)


当编译器运行时遇到调用printhex(temp),它假设(根据 C89 规则)它是一个返回int具有不确定的参数列表(但不是正式的可变参数列表 - varargs 函数,例如printf()范围内必须始终有原型)。当您随后将其定义为返回时void,它会感到不安并报告冲突的类型错误。根据 C99 规则,在使用函数之前,您应该在作用域内有一个原型。

我想对你的布局发表评论;这有点不正统。

函数定义中不需要那么多空格(使用less函数定义中的空白):

void    print2       ()
void    printhex       (unsigned int   u)

将会:

void print2(void)
void printhex(unsigned int u)

如果我正在写它们。我用显式编写函数(void)在定义中,因此它与函数的原型符号相匹配。实际上,如果我写它们,它们更可能带有前缀static。如果我编写的函数不会在其所在的源文件之外使用,那么我会自动将其设为静态。此外,如果该函数在使用之前被定义为静态,那么我不需要对该函数进行第二次声明。如果函数不是静态的,在我的书中应该有一个声明该函数的标头,并且该标头应该在定义该函数的文件和使用该函数的文件中使用。这确保了一致性。

另外,你使用abs(temp)这有点奇怪;这是一种冗长的转换方法unsigned int到一个签名的int,但你最好这样写:

 printf("%u\n", temp);

最后,我建议你使用more中的空白for loop:

for (j = 0; j < bits; j++)

逗号或分号前不能有空格;二元运算符周围有空格(但不是一元运算符,或非常紧密绑定的运算符,例如下标或成员 (. or ->) 运算符)。

您的输出将十六进制与十进制交错;您可能会发现使用以下方法更好:

printf("%10u ", temp);

将十进制值右对齐放在该行上,使十六进制值出现在同一行的后面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中的类型冲突,为什么? 的相关文章

随机推荐