C语言中函数声明实现的位置

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

先看一段代码:

#include <stdio.h>

int main()
{
    fun1();
    fun1();
    fun1();
    fun2();
    return 0;
} 

/*方法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 0;
} 

编译之后结果显示

--------------------配置: 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函数之前声明一次看看能不能编译成功

 1 #include <stdio.h>
 2
 3 void fun1(void);
 4 void fun2(void);
 5
 6 int main()
 7 {
 8     fun1();
 9     fun1();
10     fun1();
11     fun2();
12     return 0;
13 }
14
15 /*方法1,用于输出消息1*/
16 void fun1()
17 {
18     printf("For he‘s a jolly good fellow!\n");
19 }
20
21 /*方法2,用于输出消息2*/
22 void fun2()
23 {
24     printf("Which nobody can deny!\n");
25 }

编译器编译结果:

--------------------配置: 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 函数之前。

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

时间: 2024-10-25 22:11:02

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

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

函数原型: 原型prototype是函数的声明:描述了函数的返回值与参数: 函数原型说明了两点: 1.该函数的返回值 2.该函数的参数及其类型 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 函数的参数: 参数到底是什么:传递给函数的信息称为参数. 如果一个函数不接受任何参数的话,函数头的圆括号中应该写关键字void. 如果函数接受一个int类型的变量,则可以如下声明一个函数原型: void func (int n) 函数返回值类

C语言中的声明与定义的区别

1.对于下面的声明语句 int a; 如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同时为a分配了存储空间.因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0). 2.又如下面的声明语句: int a = 7; 在定义a的同时也为a明确指定了初始值.这个语句不仅为a分配内存,而且也说明了在该内存中应

C语言中标识符声明的几个关键字总结

C语言中声明一个名称就是把一个标识符与某个C语言对象相关联,如变量.函数或类型,C语言中可以声明的名称包括:变量.函数.类型.类型标志.结构成员与联合成员.枚举常量.语句标号和预处理器宏.除了语句标号和预处理器宏之外,所有标识符都在C语言声明中声明,变量.函数.类型放在声明的声明符中,类型标志.结构成员与联合成员和枚举常量在声明的某种类型说明符中声明,语句标号在C语言函数中出现时声明,而预处理器宏用#define预处理器命令声明. 如下列声明: extern const volatile uns

从头开始-05.C语言中函数

函数: 完成特定功能代码段 特点:函数只有调用的时候才会执行 定义格式:返回值类型 函数名称(形参类型 形参名称,...){ 语句; ...  } 函数参数 形式参数:在定义函数的时候,函数名后面小括号中的参数 实际参数:在函数调用的时候,函数名后面小括号中的参数 注意点: 形参与实参必须一一对应 实参与形参的类型必须一致 基本数据类型作为函数参数传递是值传递 组作为函数参数传递是地址传递 指针作为函数参数传递是地址传递 结构体作为函数参数传递是值传递 返回值: return 作用: 1.结束函

C语言中函数的分类

在C语言中函数被分为两类,一类是系统提供的标准函数,又称库函数.标准函数由系统定义,在程序中可以直接调用,例如:printf(),scanf()等.另一类是用户自己定义的函数. 用户自己定义函数要遵循一定的规则,而且定义函数它一般的格式如下: 函数类型 函数名称(形式参数表){ 说明语句序列 可执行语句序列 } 通常函数类型与函数的返回值的类型一致,函数名称的命名规则同变量命名完全一样.形式参数表是用于调用函数和被调用函数之间的数据传递,因此它也需要进行类型说明. 例如: #include <s

C语言中函数和指针的参数传递

最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的.所以就产生了一些东西.和我们本来想的有差别. 一.明确C语言中函数的入口: C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来

C语言中函数返回数组

#include "stdio.h"/*int* set(int a,int *c){ int *b; b=malloc(sizeof(int)*3); c[0]=a; c[1]=1+a; c[2]=2+a; b[0]=13; b[1]=14; b[2]=15; return b;}*/char *set(void){ char *buf; buf=malloc(sizeof(char)*3);//创建内存区 buf[0]=0x30; buf[1]=0x31; buf[2]=0x32;

JS中函数声明与函数表达式的不同

Js中的函数声明是指下面的形式: function functionName(){ } 这样的方式来声明一个函数,而函数表达式则是类似表达式那样来声明一个函数,如: var functionName = function(){ } 可能很多朋友在看到这两一种写法时会产生疑惑,这两种写法差不多,在应用中貌似也都是可行的,那他们有什么差别呢? 事实上,js的解析器对函数声明与函数表达式并不是一视同仁地对待的.对于函数声明,js解析器会优先读取,确保在所有代码执行之前声明已经被解析,而函数表达式,如同

C语言中函数参数为什么是由右往左入栈的?

先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } int main(int argc, char *argv[]) { foo(100, 200, 300);