在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误

先看一段代码:

#include <stdio.h>

int main()
{
fun1();
fun1();
fun1();
fun2();
return ;
} /*方法1.用于输出消息1*/
void fun1()
{
printf("For he's a jolly good fellow!\n");
} /*方法2,用于输出消息2*/
void fun2()
{
printf("Which nobody can deny!\n");
}

这时候编译器提示如下

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

正在编译 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c...
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:27: error: conflicting types for 'fun1'
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:10: error: previous implicit declaration of 'fun1' was here
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:33: error: conflicting types for 'fun2'
[Error] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:13: error: previous implicit declaration of 'fun2' was here
[Warning] C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c:35:2: warning: no newline at end of file

编译中止 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c: 4 个错误, 1 个警告

提示出错,出现这个问题的原因是函数没找到?对于E文不好的我,这下可难坏我了,怎么办...

那我换个方式试试

#include <stdio.h>

/*方法1,用于输出消息1*/
void fun1()
{
printf("For he's a jolly good fellow!\n");
} /*方法2,用于输出消息2*/
void fun2()
{
printf("Which nobody can deny!\n");
} int main()
{
fun1();
fun1();
fun1();
fun2();
return ;
}

编译之后结果显示

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

正在编译 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c...

完成编译 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c: 0 个错误, 0 个警告
生成 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.o

说明,之前的猜测正确,那么我们再想想,C语言学习的时候说过函数声明,那我们要不要再试试把之前编译错误的那段代码在main函数之前声明一次看看能不能编译成功

 #include <stdio.h>

 void fun1(void);
void fun2(void); int main()
{
fun1();
fun1();
fun1();
fun2();
return ;
} /*方法1,用于输出消息1*/
void fun1()
{
printf("For he's a jolly good fellow!\n");
} /*方法2,用于输出消息2*/
void fun2()
{
printf("Which nobody can deny!\n");
}

编译器编译结果:

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------

正在编译 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c...

完成编译 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.c: 0 个错误, 0 个警告
生成 C:\Users\yinhe\Documents\C-Free\Temp\Practice2-12-4.o

 

编译成功,说明了C和C#的区别之处,所以在以后C编程之旅中我们需要谨记需要使用自定义函数的时候,那么就尽量让自定义函数的声明和实现出现在main 函数之前。

在这里我想说,娘啊,我好后悔上学的时候不好好学英语~~

C语言中函数声明实现的位置的更多相关文章

  1. C语言中函数声明、形参、实参

    函数原型: 原型prototype是函数的声明:描述了函数的返回值与参数: 函数原型说明了两点: 1.该函数的返回值 2.该函数的参数及其类型 ++++++++++++++++++++++++++++ ...

  2. c语言中函数的简单介绍

    c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数  int func() 3.有参 ...

  3. C语言中函数参数传递

    C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值.(2)地址传递,就是把 ...

  4. C语言中函数的调用方式

    第一眼看到这样一个题目的我,心想除了如下的直接调用还能怎么调用呢? 1 void fun(void) 2 { 3 ...... 4 //你的代码 5 ..... 6 } 7 int main(void ...

  5. c语言中函数参数入栈的顺序是什么?为什么

    看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){   ...

  6. C语言中函数和指针的參数传递

    近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...

  7. javascript中函数声明、变量声明以及变量赋值之间的关系与影响

    javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...

  8. C语言中函数返回字符串的4中方法

    C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...

  9. C语言中的声明解析规则——数组,指针与函数

    摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...

随机推荐

  1. Mantis搭建步骤

    (1)安装EeasyPHP (2)解压Mantis到EeasyPHP内www目录下 (3)将PHP复制到www目录下 并修改apache下httpd.conf及php.ini两个文件的php配置目录 ...

  2. delphi tidhttp 超时设置无效的解决方法

    现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...

  3. connect/express 的参考

    1.Node.js[5] connect & express简介    对connect中间件的分类比较容易理解. http://www.cnblogs.com/luics/archive/2 ...

  4. 在CentOS 7.2下升级gcc编译器的版本

    默认情况下,CentOS 7.2预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编 ...

  5. selenium测试框架篇,页面对象和元素对象的管理

    前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让 ...

  6. Uiautomator--Uiselector元素定位

    一.UiSelector作用 按照一定的条件(例如控件的text值,资源id),定位界面上的元素.UiSelector对象的最终目的是去构造一个UiObject对象. 二.元素定位 1.根据text定 ...

  7. WPF 如何绘制不规则按钮,并且有效点击范围也是不规则的

    最近在做一个东西,如地图,点击地图上的某一区域,这一区域需要填充成其他颜色.区域是不规则的,而且点击该区域的任一点,都能够变色.普通的按钮只是简单的加载一幅图肯定是不行的.查了很多资料,终于把它搞定了 ...

  8. angular1.x的简单介绍(二)

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

  9. XML带多属性解析为一个实体类(利用反射)

    最近在对接一个银行的项目,大概就是类似一个钱包的功能,在请求返回的数据时,发现返回的数据标准的XML格式的支付串,格式如下 <kColl id="inputOrig" app ...

  10. 网站开启https后加密协议始终是TLS1.0如何配置成TLS1.2?

    p { margin-bottom: 0.1in; line-height: 120% } 网站开启https后加密协议始终是TLS1.0如何配置成TLS1.2? 要在服务器上开启 TLSv1.,通常 ...