在看C语言写的项目时,遇到一个很奇怪的事情:
在*.c文件中有一个函数
add(2,3);
然后按照常规思路,这个函数一定会在某个头文件中声明,然后才能调用,否则它将是未声明操作而报错,实际上这里并不会报错。
现有两个代码文件
test.c:
int add(int a,int b)
{
return a+b;
}
main.c
#include <stdio.h>
int main()
{
printf("-------------\n");
printf("add:=%d\n",add(3,2));
return 0;
}
使用编译命令:
gcc main.c test.c
屏幕输出:
main.c: In function 'main':
main.c:6:21: warning: implicit declaration of function 'add' [-Wimplicit-function-declaration]
printf("add:=%d\n",add(3,2));
得到一个a.exe文件执行该文件:
-------------
add:=5
由此可见,在C语言中,函数的声明,并不一定要声明在头文件中。但是事实一定是这样的吗?
上面,使用gcc作为主要的编译工具,众所周知,g++也支持编译C文件。
编译时,如下:
>: g++ main.c test.c
main.c: In function 'int main()':
main.c:6:21: error: 'add' was not declared in this scope
printf("add:=%d\n",add(3,2));
^~~
谜底揭开了,g++编译时直接报错,这可能也是c语言和c++之间的时代遗留问题导致。