C语言中函数声明实现的位置
2015-09-18 17:58
405 查看
在学习C语言的时候我遇到了这么个事情,因为之前先学习的C#,在C#编译器中,函数的声明位置不会影响编译的结果,但是在C语言中却发生了错误
先看一段代码:
这时候编译器提示如下
--------------------配置: 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文不好的我,这下可难坏我了,怎么办...
那我换个方式试试
编译之后结果显示
--------------------配置: 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函数之前声明一次看看能不能编译成功
编译器编译结果:
--------------------配置: 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 函数之前。
在这里我想说,娘啊,我好后悔上学的时候不好好学英语~~
先看一段代码:
#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函数之前声明一次看看能不能编译成功
#include <stdio.h> void fun1(void); void fun2(void); 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...
完成编译 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 函数之前。
在这里我想说,娘啊,我好后悔上学的时候不好好学英语~~
相关文章推荐
- 1.2 第一个C++程序
- [C++]unordered_map的使用
- 1.1 从C到C++,C语言与C++的关系
- C++技术点积累(5)——泛型编程(函数模板、类模板)
- c++没有实例化的类成员访问
- c++生成随机数
- 【C++】智能指针
- C++STL 迭代器
- 用 C++实现的简单物流信息存储
- Effective C++——operator =
- C语言改变循环的状态
- C语言中动态分配数组
- C++中传递数组参数的几种用法和注意点
- swig C#链接c++ dll
- Effective C++——条款45(第7章)
- c++ 抽象概念,内存格局,浅拷贝,深拷贝,临时对象,无名对象
- C++中不能被定义为虚函数的函数
- 详解C++编程中的单目运算符重载与双目运算符重载
- c/c++复习日记 1.不带缓存的I/O和标准I/O
- C++运算符重载规则详解