C/C++ 函数原型(或函数声明)的相同点与不同点

4 篇文章 0 订阅
1 篇文章 0 订阅

1、C++必须要有函数原型,C语言可选

1.1  C语言

1  #include<stdio.h>

2  

3  int main(intargc, char *argv[])

4  {

5      func1();

6      func2();

7      return 0;

8  }

9  

10  void func1()  //warning: conflicting types for ‘func1’

11  {}

12  

13  voidfunc2()   //warning: conflicting typesfor ‘func2’

14  {}

该段代码用gcc编译,没有error,只有两个warning。注意warning的位置不是在56行,而是在1013行!warning的告警类型是conflictingtypes,而不是函数未找到,这是为什么呢?

         实际上,在函数调用前,如果没有对函数进行声明,则编译器会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int 型。编译器编译上述代码,执行到第5行处,便会将函数func1的函数原型当做intfunc1(); 编译到第10行处,发现voidfunc1() 便会告警类型冲突(返回类型intvoid冲突)。如果将第10行,第13行处的函数返回类型改为int,则编译器不会出现告警。

 

1.2 C++

1  #include<iostream>

2  

3  int main(intargc, char *argv[])

4  {

5      func1();  //error: ‘func1’ was not declared in thisscope

6      func2(); //error: ‘func2’ was not declared in this scope

7      return 0;

8  }

9  

10  void func1()

11  {}

12  

13  voidfunc2()

14  {}

         该段代码用g++编译后,第56行会error。说明C++中必须要用函数原型! 也许有人会说将10-14行代码放在main函数前,就不会产生error。其实,如果被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译器已经预先知道了已定义的函数类型,会根据函数首部提供的信息对函数的调用作正确性检查。

 

2、函数声明的参数列表

参数列表,C语言 C++语言要求一致。这里不分开讨论。

1   #include <stdio.h>

2

3   void func1(int);

4   void func2(int c);

5

6   int main(int argc, char *argv[])

7   {

8       func1(0);

9       func2(0);

10      return 0;

11  }

12

13  voidfunc1(int a)

14  {}

15 

16  voidfunc2(int b)

17  {}

 

a)函数原型不要求提供变量名,有类型列表就足够了。比如第3voidfunc1(int);

b)原型中变量名相当于占位符,不必与函数定义中的变量名相同。比如第4voidfunc2(int c);

 

3、VOID  没有参数

3.1 C++中,括号为空与在括号中使用void是等效的——意味着函数没有参数。

#include <iostream>

 

void func1(void);

void func2();

 

int main(int argc, char *argv[])

{

    func1();

    func2();

    return 0;

}

 

void func1()

{}

 

void func2(int a)

{}

使用g++编译会产生errorundefined reference to `func2()'

 

3.2 在C语言中,括号为空则意味着不指出参数——这也意味着参数列表可以在后面的函数定义中列出。

#include<stdio.h>

 

voidfunc1();

voidfunc2();

 

intmain(int argc, char *argv[])

{

    func1(123); //注意:这里竟然没有告警!

    func2(0);

    return 0;

}

 

voidfunc1(void)

{}

 

voidfunc2(int b)

{}

使用gcc编译,没有告警(即便加上-Wall选项)。

 

上述代码所使用的编译器均为gcc/g++ (GCC)4.4.4

参考文献:

1、《C++ Primer Plus中文版(第6版)》

2、函数定义与声明 http://blog.csdn.net/haiyan0106/article/details/3043998

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值