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

时间:2013-01-27 01:55:50

标签: c binary hex type-conversion

我尝试用C语言编写基本练习,使用Binary和Hex。我做了一个方法来打印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);
}

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

2 个答案:

答案 0 :(得分:6)

您遇到问题是因为在使用printhex()之前未提供printhex()的原型。

print2()物理地放在extern void printhex(unsigned int u); 之前的源文件中,或添加声明:

print2()

在定义printhex()之前。 (不要在print2()内声明printhex(temp);尽管它在语法上是合法的,但这样做是不好的做法。)


当编译器在调用int上运行时,它假定(根据C89规则)它是一个返回带有不确定参数列表的printf()的函数(但不是正式变量的一个函数)参数列表 - 像void这样的varargs函数必须始终具有范围内的原型。当您随后将其定义为返回void print2 () void printhex (unsigned int u) 时,它会被沮丧并报告冲突类型错误。根据C99规则,在使用函数之前,您应该在范围内使用原型。

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

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

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

将是:

(void)

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

另外,你使用稍微奇怪的unsigned int;这是一种将int转换为签名 printf("%u\n", temp); 的冗长方式,但您最好写一下:

for

最后,我建议你在for (j = 0; j < bits; j++) 循环中使用 more 空格:

.

逗号或分号前没有空格;二元运算符周围的空格(但不是一元运算符,或非常紧密绑定的运算符,如下标或成员(->printf("%10u ", temp); )运算符)。

您的输出将十六进制与十进制交错;你可能会发现它更好用:

{{1}}

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

答案 1 :(得分:4)

您在宣布之前尝试使用(调用)printhex。通过说出void printhex (unsigned int u)void printhex (unsigned int)或将定义移至print2之前,向前声明。