【问题标题】:Conflicting types in C, why?C中的冲突类型,为什么?
【发布时间】:2013-01-10 16:59:51
【问题描述】:

我正在尝试使用 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”),编译器不接受。

【问题讨论】:

  • 哪行代码给出了错误?
  • @LeorA 只有一行调用了 printHex。

标签: c binary hex type-conversion


【解决方案1】:

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

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

extern void printhex(unsigned int u);

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


当编译器运行调用 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);

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

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

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

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

printf("%10u ", temp);

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

【讨论】:

  • 谢谢我第一次使用 C 时不知道这个
【解决方案2】:

您在声明之前尝试使用(调用)printhex。要么通过 void printhex (unsigned int u)void printhex (unsigned int) 转发声明它,要么将定义移动到 print2 之前。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多