C语言中函数声明实现的位置
在学习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语言中函数声明实现的位置的更多相关文章
- C语言中函数声明、形参、实参
函数原型: 原型prototype是函数的声明:描述了函数的返回值与参数: 函数原型说明了两点: 1.该函数的返回值 2.该函数的参数及其类型 ++++++++++++++++++++++++++++ ...
- c语言中函数的简单介绍
c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数 int func() 3.有参 ...
- C语言中函数参数传递
C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值.(2)地址传递,就是把 ...
- C语言中函数的调用方式
第一眼看到这样一个题目的我,心想除了如下的直接调用还能怎么调用呢? 1 void fun(void) 2 { 3 ...... 4 //你的代码 5 ..... 6 } 7 int main(void ...
- c语言中函数参数入栈的顺序是什么?为什么
看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){ ...
- C语言中函数和指针的參数传递
近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...
- C语言中函数返回字符串的4中方法
C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...
- C语言中的声明解析规则——数组,指针与函数
摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...
随机推荐
- css清除浮动深度解析
首先引入一个新的概念"包裹". float:left会使得该属性的作用容器包裹住其内部元素:那么还有么有其他属性能够产生类似于浮动这种包裹性? 答案是有的:像"浮动&qu ...
- Servlet技术(使用myeclipse)
Servlet跟JavaBean本质上都是严格遵循规则的java包. Servlet基本结构: Public class Servlet 类名称 extends HttpServlet{ Pu ...
- Uiautomator--断言的使用
一.断言函数的使用 1.用例结构: 自动化用例结构,一般可以分成一个用例集,然后用例集下面会有非常多的用例组成,我们可以从多个用例中抽出一些用例组成测试套件. 2.用例的标准结构: setUp:初始化 ...
- printf对齐
C语言中,将printf函数打印出的字符像表格一样分类对齐.%-10d表示这个字符型占10个字节,负号表示左对齐.即下面表格中的x1位置开始填充.如果是%10d,表示右对齐,即在x10位置对齐. x1 ...
- C语言简单文法
<源程序>→<外部声明>|<外部声明><函数体> <外部申明>→<头文件><函数声明>|其他声明 <函数体&g ...
- SVN数据仓库迁移
1.在新服务器上部署环境 yum -y install subversion 2.备份原服务器数据仓库 svnadmin dump /home/myrepos >/data/svn_dump s ...
- JAX-RS规范-常用注解浅析(WebServer)
一.@Path 若希望一个Java类能够处理REST请求,则这个类必须至少添加一个@Path("/")的annotation: 对于方法,这个annotation是可选的,如果不添 ...
- MD5 加密
字符串加密 // 1. 准备好一个字符串 NSString *string = @"asdasfaf"; // 2. MD5加密是基于C语言的. 所以要把这个字符串转化成C的字符串 ...
- Docker和Docker-compose安装教程以及docker-elk,docker-storm安装教程
此安装教程仅供我自己安装配置时查看,其他的人不可以偷看!!! 安装Docker 1. Update package information, ensure that APT works with th ...
- android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
<activity android:name="xxxActivity" android:configChanges="keyboard|keyboardHidde ...