隐式函数声明的行为

时间:2017-07-03 02:35:27

标签: c function-declaration implicits function-definition

我知道使用没有原型的函数是错误的。 但当我摆弄时,我遇到了这个奇怪的冲突的行为。

TEST1

    #include <stdio.h>
    #include <limits.h>
    void main(){
        char c='\0';
        float f=0.0;
           xof(c,f);/* at this point implicit function declaration is 
generated as int xof(int ,double ); */ 
    }
    int xof(char c,float f)
    {
        printf("%d %f\n", c,f);
    }

隐式函数声明将是int xof(int,double);

错误是

  

variablename.c:8:5:错误:&#39; xof&#39;的冲突类型int xof(char   c,浮动f)

我理解这一点是因为隐式生成的函数声明(默认整数值为INT,小数为DOUBLE)与以下函数定义不匹配

TEST2

#include <stdio.h>


 #include <limits.h>
    void main(){
        unsigned int a =UINT_MAX;
        int b=0;
        xof(a); /* implicit function declaration should be int xof(int); */
    }

    int xof(unsigned a,int b)
    {
        printf("%d %d\n", a,b);
    }

隐式函数声明将是int xof(int); ,它应与函数定义冲突

但是运行良好(没有错误)并输出 &#39; a&#39; 表现为&#39; int&#39;价值和&#39;&#39; 有未定义的垃圾&#39;

  

-1 12260176

有人可以解释一下。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

当遇到没有定义的函数调用时,生成的隐式定义将始终为int (*)(),即接受未指定数量的参数并返回int的函数。函数调用中的实际参数是。这就是你的误解来自的地方。

对于第一个程序,生成的错误消息为:

  

/tmp/x1.c:10:错误:'xof'的相互冲突类型
/tmp/x1.c:10:   注意:具有默认促销的参数类型不能匹配   空参数名称列表声明
/tmp/x1.c:6:错误:上一个   'xof'的隐含声明在这里

出现错误是因为实际的函数定义包含一个或多个参数,其类型受默认促销规则的约束。具体而言,任何排名低于int的整数类型(在这种情况下为char)都会在表达式中提升为int。同样适用于float参数,该参数在表达式中被提升为double。换句话说,使用隐式声明不可能将正确类型的参数传递给此函数。

第二个程序不会生成错误,因为参数(intunsigned int)都不受默认促销规则的约束。在这种情况下,您调用未定义的行为,因为您没有传递正确类型的正确数量的参数。如果您确实传入了2个正确类型的参数,那么行为就会很明确。

请注意,隐式函数声明是C89功能,在C99及更高版本中不受支持,尽管某些编译器仍然可以在C99或C11模式下接受它们作为扩展。