C函数定义和声明

路卡

我是一名Java程序员,我学习了一些C ++,现在我正在为自己的工作学习一些C。我不了解有关函数声明/定义和相关函数调用的C行为。从K&R,我知道在C中(与C ++完全不同),我可以调用一个以前未声明的函数,并且编译器假定该类型的隐式声明:

int main() 
{
  function(10);   // implicit function declaration ( int function() )
}

而且我知道这样的声明意味着一个函数接受一个固定但不确定数量的任何类型的参数(只要每个调用与其他调用一致)。我知道这是C&89之前的K&R C,但我想知道它的工作原理。现在,我有了这个测试代码,我无法理解:

#include <stdio.h>

function();

int main()
{
  printf("hello %d",function(1,2,3));
  implicit(11,12,32);     // implicit function declaration ( implicit() )
}


int implicit(int b)
{

}

function(int a)
{

}

function声明的情况下(假定返回类型为int,没有关于参数的假设)与定义匹配(编译器发出警告),但是如果我用错误的参数调用该函数,它将进行编译!功能相同implicit我听不懂

一些程序员哥们

您需要记住的是,关于声明和定义,编译过程几乎是顺序的。function正如您所说,当编译器处理所有调用时,声明就是对参数没有任何假设,这意味着您可以使用任意喜欢的参数来调用函数。当编译器看到该定义时,不会回过头来发出有关该调用的错误,但是可能会发出警告。

对于implicit函数,当编译器第一次看到它时,它将假定参数是您在推导出声明时在调用中传递的参数。同样,它将在以后看到该声明之前不知道其他任何信息,然后可能发出警告。

调用具有太多或更少参数的函数会导致未定义的行为,这就是为什么隐式声明的函数如此危险以及在声明函数时使用空的参数列表的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数声明与定义C

来自分类Dev

Haskell GHCI编译器:定义和声明简单函数时解析repl中的错误

来自分类Dev

为什么对于函数的定义和声明,我可以使用不同的签名?

来自分类Dev

Haskell GHCI编译器:定义和声明简单函数时解析repl中的错误

来自分类Dev

如何定义外部变量和声明?

来自分类Dev

constexpr:constexpr 成员的定义和声明

来自分类Dev

在C中的定义和声明中使用static关键字

来自分类Dev

如何访问一个函数在另一个函数中定义和声明的数组?

来自分类Dev

在C ++中使用指令和声明

来自分类Dev

Codeigniter 控制器错误警告。未定义的函数数据库项和声明兼容

来自分类Dev

如何分开子模板类的定义和声明

来自分类Dev

gcc中的模板显式实例化(定义和声明)

来自分类Dev

在Java类内部定义和声明内部接口的约定?

来自分类Dev

Fortran子例程/函数参数名称和声明

来自分类Dev

C ++ 11变量初始化和声明

来自分类Dev

C ++类成员基数和声明之间的映射是否正确?

来自分类Dev

相当于calloc的c ++和声明数组变量的空间

来自分类Dev

目标C中的数据类型和声明

来自分类Dev

C ++类成员基数和声明之间的映射是否正确?

来自分类Dev

概念和声明顺序

来自分类Dev

朋友功能和声明

来自分类Dev

字典和声明变量

来自分类Dev

当成员是用户定义的类时,如何编写正确的类定义和声明?

来自分类Dev

使用函数句柄创建创建函数和声明符号之间有什么区别?

来自分类Dev

函数定义与C中的声明不匹配,但在C ++中

来自分类Dev

我可以在标头中定义和声明extern对象的任何方式吗?

来自分类Dev

C ++:函数重新声明是未定义的行为吗?

来自分类Dev

错误C2535:成员函数已经定义或声明

来自分类Dev

用于分隔C ++模板函数的声明和定义的正确格式

Related 相关文章

  1. 1

    函数声明与定义C

  2. 2

    Haskell GHCI编译器:定义和声明简单函数时解析repl中的错误

  3. 3

    为什么对于函数的定义和声明,我可以使用不同的签名?

  4. 4

    Haskell GHCI编译器:定义和声明简单函数时解析repl中的错误

  5. 5

    如何定义外部变量和声明?

  6. 6

    constexpr:constexpr 成员的定义和声明

  7. 7

    在C中的定义和声明中使用static关键字

  8. 8

    如何访问一个函数在另一个函数中定义和声明的数组?

  9. 9

    在C ++中使用指令和声明

  10. 10

    Codeigniter 控制器错误警告。未定义的函数数据库项和声明兼容

  11. 11

    如何分开子模板类的定义和声明

  12. 12

    gcc中的模板显式实例化(定义和声明)

  13. 13

    在Java类内部定义和声明内部接口的约定?

  14. 14

    Fortran子例程/函数参数名称和声明

  15. 15

    C ++ 11变量初始化和声明

  16. 16

    C ++类成员基数和声明之间的映射是否正确?

  17. 17

    相当于calloc的c ++和声明数组变量的空间

  18. 18

    目标C中的数据类型和声明

  19. 19

    C ++类成员基数和声明之间的映射是否正确?

  20. 20

    概念和声明顺序

  21. 21

    朋友功能和声明

  22. 22

    字典和声明变量

  23. 23

    当成员是用户定义的类时,如何编写正确的类定义和声明?

  24. 24

    使用函数句柄创建创建函数和声明符号之间有什么区别?

  25. 25

    函数定义与C中的声明不匹配,但在C ++中

  26. 26

    我可以在标头中定义和声明extern对象的任何方式吗?

  27. 27

    C ++:函数重新声明是未定义的行为吗?

  28. 28

    错误C2535:成员函数已经定义或声明

  29. 29

    用于分隔C ++模板函数的声明和定义的正确格式

热门标签

归档