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

Jam*_*mes 2 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 6

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

要么printhex()物理print2()放在源文件中,要么添加声明:

extern void printhex(unsigned int u);
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

void    print2       ()
void    printhex       (unsigned int   u)
Run Code Online (Sandbox Code Playgroud)

将会:

void print2(void)
void printhex(unsigned int u)
Run Code Online (Sandbox Code Playgroud)

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

另外,你使用的abs(temp)有点奇怪; 将unsigned int签名转换为签名是一种冗长的方式int,但你最好写一下:

 printf("%u\n", temp);
Run Code Online (Sandbox Code Playgroud)

最后,我建议你在循环中使用更多的空格for:

for (j = 0; j < bits; j++)
Run Code Online (Sandbox Code Playgroud)

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

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

printf("%10u ", temp);
Run Code Online (Sandbox Code Playgroud)

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