【问题标题】:Receiving "error: conflicting types for 'function'"收到“错误:‘函数’的类型冲突”
【发布时间】:2017-10-04 21:28:55
【问题描述】:

我正在创建一个程序来将二进制、十进制、十六进制和八进制转换为这些选项中的任何一个。对于十六进制,我需要一种将大于 9 的值格式化为 A、B、C、D、E、F 之一的方法。由于这将在多个函数中重复,我决定创建以下函数:

char hexRepresentation(double n){
    if(n > 9){
        if(n==10) return 'A';
        if(n==11) return 'B';
        if(n==12) return 'C';
        if(n==13) return 'D';
        if(n==14) return 'E';
        if(n==15) return 'F';
    }

    return (char)n;
}

但是,当我尝试编译时,我收到了错误

“hexRepresentation”的类型冲突

我是 C 语言的新手,来自 Java,我正在为最简单的实现方法而苦恼。任何帮助将不胜感激!

【问题讨论】:

  • 如果你通过了 5.6 会返回什么?甚至是小于 10 的整数值? (char)5 不是 '5'
  • 除了接受doubles 的可疑决定之外,您是否在使用前声明了该功能?如果您来自 Java,您可能已经忘记了这一点。
  • 目前我什至不关心这个。我从其他函数中得到 n 作为双精度 - 特别是从 math.h 的 pow() 中。到目前为止,我只使用整数。
  • @DanielFischer,请原谅我;就像我说的,全新的。我想我知道你的意思。您指的是在 main() 之前命名其他函数,对吗?我还有其他功能,嗯,没有这样做就可以发挥作用。
  • 无需为新人道歉。至于缺少声明,在旧版本的 C(C99 之前)中,使用以前未声明的函数提供了返回类型为 int 的函数的隐式声明。默认情况下,许多编译器仍然在某种 C99 之前的模式下工作,并接受隐式函数声明。但是,如果您稍后声明并定义返回类型与int 不兼容的函数,您会得到这样的incompatible type 错误。使用 gcc,在 -std=c99 模式下,您将收到隐式声明函数的警告,如果添加 -pedantic-errors,则会收到错误。

标签: c function compiler-errors


【解决方案1】:

您不会收到声明类型的错误,因为在 C 中,当您不前向声明函数时,大多数编译器会假定一个返回 int 类型的 extern 函数。实际上编译器应该警告你这个(大多数都会这样做)。然后稍后当编译器实际到达函数实现时,它会找到不同的返回类型,在本例中为 char,然后抛出“冲突类型”错误。只需转发声明所有函数即可避免此类错误。

关于什么是最好的方法,比如下面的代码会产生类似的结果:

if (n > 9)
{
   return('A' + (n - 10));
}

【讨论】:

    【解决方案2】:

    无论您在发布的代码中做什么,您都没有在函数中使用 double 数据类型。而且从函数返回类型来看,你似乎永远不会看到返回值 >127。

    这段代码突出了一些问题:(这只是说明性的)

    char hexRepresentation(double n){
        if(n > 9){//comparing (double>int). Bad.
            if(n==10) return 'A';
            if(n==11) return 'B';
            if(n==12) return 'C';//You wrote if(double == int). Bad.
            if(n==13) return 'D';
            if(n==14) return 'E';
            if(n==15) return 'F';
        }
    
        return (char)n; //again unsafe downgrade from 8 bytes double to 1 byte char.
    }
    

    即使您修复了编译器错误,由于函数中数据类型的这种危险使用,您也可能无法始终获得所需的结果。

    要知道它为什么不好,请看这里:

    http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating%20point%20numbers.htm

    我会在该函数体的任何地方都使用fabs(n) 而不是n

    如果在此函数定义之前存在同名函数hexRepresentation 的先前声明或定义,则会显示错误“'hexRepresentation' 的类型冲突”。另外,如果你没有声明一个函数并且它只在被调用后出现,编译器会自动假定它是int

    所以,在 main() 之前声明和定义你的函数 或在 main() 之前声明并在文件中的任何其他位置定义函数,但使用相同的函数原型。

    做:

     char hexRepresentation(double); //Declaration before main
     main()
     {
       ...
     }
     char hexRepresentation(double n){//Definition after main
     ...
     }
    

    或者

     char hexRepresentation(double n){ //Declaration and definition before main
      ...
     }
    
     main()
     {
        ...
     }
    

    【讨论】:

      【解决方案3】:

      只需创建一个具有推送和弹出功能的堆栈(用于 char)。我没有返回值,只是在同一个函数中打印它。 (仅针对整数值实现)

      #define max 100
      char a[max];
      
      void hex(int n)
      {
       while(n>0)
       {
       int rem = n%16;
       if (rem<10)
         push(rem+'0');
       elsif(rem >=10 && rem <16)
         {
           switch(rem)
           {
             case 10:
               push('A');break;
               case 11:
               push('B');break;
               case 12:
               push('C');break;
               case 13:
               push('D');break;
               case 14:
               push('E');break;
               case 15:
               push('F');break;
           }
          else
             n=n/16;
         }
         }
         i=0;
         while(top>-1)
           a[i++]=pop();
         i=0;
         while(a[i]!='\0')
           printf("%c",a[i++]);
      }
      

      有用吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 2016-01-03
        • 1970-01-01
        • 2016-02-07
        • 2013-03-25
        • 1970-01-01
        相关资源
        最近更新 更多