隐式函数声明的行为

问题描述:

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

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,双);

误差是

variablename.c:8:5: error: conflicting types for 'xof' int xof(char c,float 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);应与函数定义

的冲突,但是这个运行良好(无差错)和输出是 与“A”表现为“INT”值和“B”具有“未定义垃圾”

-1 12260176

有人可以解释这一点。 在此先感谢。

+1

C在使用前需要正确的声明。其他任何东西都是无效的C!因此,问“为什么这个C代码做了什么 - 它不是C代码,而且你不使用标准的兼容编译器或忽略警告。根据你的介绍,你很清楚。” – Olaf

+0

旧版本的C标准允许的函数参数推理,第二个例子可以通过这些松散的规则“偷渡”,这是C移动到总是需要前向声明的原因之一 – AShelly

+0

只需更新一个不超过18年的编译器,然后你 – Lundin

如果在没有定义的情况下遇到函数调用,则生成的隐式定义将始终为int (*)(),即接受未指定数量参数并返回int的函数。考虑到函数调用中的实际参数是而不是。那是你误解的来源。

在第一程序的情况下,所产生的错误信息是:因为实际的函数定义包含一个或多个参数,其类型是受试者为默认促销规则出现

/tmp/x1.c:10: error: conflicting types for ‘xof’
/tmp/x1.c:10: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
/tmp/x1.c:6: error: previous implicit declaration of ‘xof’ was here

该错误。具体而言,任何低于int(在这种情况下为char)的整数类型在表达式中被提升为intfloat参数也是如此,它在表达式中被提升为double。换句话说,使用隐式声明将正确类型的参数传递给此函数是不可能的。

第二个程序不会生成错误,因为参数(intunsigned int)都不受默认升级规则的约束。在这种情况下,您会调用未定义的行为,因为您未传递正确类型的正确数量的参数。如果您确实传入了正确类型的两个参数,则行为将会被很好地定义。

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

+0

谢谢,这清除了我的疑问:) – viru

+0

@MM好的点。更新。 – dbush