实际项目中看到有人用extern关键字来声明外部函数,这是一个很不好的行为。
如果函数原型改变的话,每个extern声明的地方都要改一遍。 如果有地方没改到呢? 我们通过一个例子来看下悲剧是怎么发生的。
头文件api.h中声明了一个函数func:
#ifndef __API_H__
#define __API_H__
void func(int a);
#endif
文件api.c中实现了func函数:
#include <stdio.h>
void func(int a)
{
printf("hello world.[%d]\n", a);
}
文件bad_test.c中调用了func函数,但是func被重新声明成无参数的了
#include <stdio.h>
extern void func();
int main(int argc,char *argv[])
{
func();
return 0;
}
编译运行结果如下:
$ gcc -Wall bad_test.c api.c
$ ./a.out
hello world.[1]
$
建议通过头文件引用的方式来使用外部函数,如果bad_test.c写成下面这样,编译就无法通过,可以有效阻止错误蔓延。
#include <stdio.h>
#include "api.h"
int main(int argc,char *argv[])
{
func();
return 0;
}
编译报错:
$ gcc bad_test.c api.c -c
bad_test.c: In function ‘main’:
bad_test.c:6:5: error: too few arguments to function ‘func’
func();
^
In file included from bad_test.c:2:0:
api.h:3:6: note: declared here
void func(int a);
^
$