c语言中函数的前置声明(MSVC编译器)

代码:用add()函数实现两个数相加并输出

add()函数写在main()函数前面

#include <stdio.h>

int add(int a, int b) {
	return a+b;
}

int main(void) {
	printf("%d\n", add(1, 1));
	return 0;
}

是没有报错的,0 errors,0warnings

add()函数写在main()函数后面

#include <stdio.h>

int main(void) {
	printf("%d\n", add(1, 1));
	return 0;
}

int add(int a, int b) {
	return a+b;
}

会有一个warning:

这个warning警告翻译过来的意思是:“add”未定义,假设“add”返回int类型。

c语言程序,都是从main()函数开始执行的,在执行到第4行的时候,遇到了add(1,  1),编译器就会不认识“add”是什么意思,它是一个变量?还是一个函数名?

执行,输出的结果是没问题的。

在main()函数前写含形参的前置声明

#include <stdio.h>

int add(int a, int b);

int main(void) {
	printf("%d\n", add(1, 1));
	return 0;
}

int add(int a, int b) {
	return a+b;
}

加上函数的前置声明(第2行)后就不会报错了:

c语言是不支持函数的重载的(c++和java支持),所以相同函数名的两个不同函数在c语言编译器中是无法编译通过的。

那么,形参就显得不重要了。

因为,函数的前置声明主要是告诉编译器“我写了这么一个函数”,好比,告诉编译器“我写了一个add()函数,你从这行之后,看到add()就认为它是一个函数,去main函数后面找这个函数!”。

形参函数头:

int add(int a, int b) {
	return a+b;
}

函数的形参是为了接收实参传过来的值,在函数头中是有用的。

但是在函数的前置声明中,是没必要也不接受实参传过来的值。前置声明仅仅是为了告诉编译器我有这么一个函数。

下面我们尝试下在前置声明中不写形参,能否编译通过。

在main()函数前写不含形参的前置声明

#include <stdio.h>

int add();

int main(void) {
	printf("%d\n", add(1, 1));
	return 0;
}

int add(int a, int b) {
	return a+b;
}

后续:MinGW编译器以及关于函数前置声明的总结

c语言中函数的前置声明(MinGW编译器)

作者: 高志远

高志远,24岁,男生

发表评论

邮箱地址不会被公开。