C语⾔中的函数声明
C语⾔中的函数声明有三种⽅法:第⼀,使⽤extern关键字进⾏全局可⽤的声明;第⼆,使⽤不带extern关键字的默认声明⽅式,这种⽅式功能与第⼀种相同;第三,使⽤static关键字将函数声明为私有函数。
⽅法1,使⽤extern关键字进⾏全局函数的声明。创建包含exp_13.c、exp_13.h、main.c三个⽂件的⼯程。⼯程代码如下:
exp_13.c
#include "exp_13.h"
void MyPrint(void)
{
printf("my print function\n");
}
exp_13.h
#include "stdio.h"
extern void MyPrint(void);
main.c
#include "exp_13.h"
int main(void)
{
MyPrint();
return 0;
}
E:\WorkSpace\01_编程语⾔\01_C语⾔\exp_13>gmake
gcc    -c -o exp_13.o exp_13.c
gcc    -c -o main.o main.c
gcc -o app exp_13.o main.o
E:\WorkSpace\01_编程语⾔\01_C语⾔\exp_13&
my print function
由上⾯的结果可以看出,函数能够在全局的范围内被调⽤。
⽅法2:使⽤默认的声明⽅式,修改exp_13.h代码如下:
#include "stdio.h"
void MyPrint(void);
代码⼯程编译执⾏如下:
E:\WorkSpace\01_编程语⾔\01_C语⾔\exp_13>gmake
gcc    -c -o exp_13.o exp_13.c
gcc    -c -o main.o main.c
gcc -o app exp_13.o main.o
E:\WorkSpace\01_编程语⾔\01_C语⾔\exp_13&
my print function
看得出,程序的执⾏正常。
⽅法3:把函数声明为私有函数,修改代码细节如下:
Exp_13.c
#include "exp_13.h"
static void MyPrint(void);
void MyPrint(void)
{
编程语言翻译printf("my print function\n");
}
Exp_13.h
#include "stdio.h"
/*
void MyPrint(void);
*/
Main.c
#include "exp_13.h"
extern void MyPrint(void);
int main(void)
{
MyPrint();
return 0;
}
如果是把函数定义为static,函数变具有了私有属性,对本⽂件可见。即使是在外部使⽤了extern关键字声明也不能够正确编译。编译提⽰如下:
E:\WorkSpace\01_编程语⾔\01_C语⾔\exp_13>gmake
gcc    -c -o exp_13.o exp_13.c
gcc    -c -o main.o main.c
gcc -o app exp_13.o main.o
main.o:main.c:(.text+0xc): undefined reference to `MyPrint'
<: error: ld returned 1 exit status
gmake: *** [app] Error 1
在《C专家编程》翻译本中提到,⼤多数时候全局函数的声明⼀般都不会使⽤extern关键字。不过,从我⾃⼰的个⼈编程实践经验来看,⼀直以来似乎少见不使⽤extern的时候。说起来,获取还真是谨慎为上。
如果函数使⽤static在头⽂件中进⾏声明,最终的作⽤域还是会在相应的C⽂件中。这是跟编译实现的机理有关的,编译器的预处理器会在编译的时候把所需的头⽂件信息插⼊到C⽂件中。⼯程修改如下:
exp_13.c
#include "exp_13.h"
void MyPrint(void)
{
printf("my print function\n");
}
exp_13.h
#include "stdio.h"
static void MyPrint(void);
#include "exp_13.h"
extern void MyPrint(void);
main.c
int main(void)
{
MyPrint();
return 0;
}
编译编译提⽰:
E:\WorkSpace\01_编程语⾔\01_C语⾔\exp_13>gmake
gcc    -c -o exp_13.o exp_13.c
gcc    -c -o main.o main.c
main.c:3:13: warning: 'MyPrint' used but never defined
extern void MyPrint(void);
^
gcc -o app exp_13.o main.o
main.o:main.c:(.text+0xc): undefined reference to `MyPrint' : error: ld returned 1 exit status
gmake: *** [app] Error 1
上⾯的信息,跟直接在内部声明的效果完全⼀样。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。