关于static和extern、头文件的一点总结。 【转】
今天写了一个测试程序。突然想起了几个问题。特地测试了一下:
主程序为testemail.c
#include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include "system.h"
5
6
7 int main(int argc,char ** argv)
8 {
9 int ret;
10 NET_EMAIL getmail ;
11 NET_EMAIL * pgetmail = &getmail;
12 strcpy(pgetmail->SendAddr,"root@localhost.localdo");
13 strcpy(pgetmail->Sendername,"");
14 strcpy(pgetmail->Title,"meinv");
15 strcpy(pgetmail->Recievers,"intermilan@yeah.net,mm@yer.cn,4393@qq.com");
16 strcpy(pgetmail->path,"/var/log/messages");
17 SendEmail(pgetmail);
18 print();
19 }
头文件为system.h
里面声明了NET_EMAIL这种结构体。也声明了SendEmail和print这两个函数。
被测试程序为system.c里面实现了SendEmail和print
测试结果如下:
1.即使不在system里声明函数SendEmail和print,只要system.c和testemail在同一个目录下。
总是能够编译通过并且可以成功运行。-------这说明函数默认的性质为extern的。
2.当system.c里声明两个函数关键字为static的时候,编译就会报错。可见static的作用是限制函数
只能在该文件内被引用。
那么问题出现了。这样的话,某种意义上来说头文件有什么用呢?
经过查找资料和测试如下
1.很多商业代码不会提供给客户源码。比如这个system.c在真正用的时候,可能会编译成system.o的形式提供给客户,
给其它的程序开发人员来调用。这样的话,如果没有system.h,其它的程序员怎么知道有SendEmail这个函数,即便
知道,怎么精确的知道用法和参数?所以这个时候头文件就起到了说明书的作用了。
2.测试当system.h里没有SendEmail的时候,即便在testemail.c里调用SendEmail的时候,给它一个不合法的参数,发
现编译仍然可以通过,但是真正运行的时候就出现了段错误。这样的话会给排除BUG带来困难。因此这个时候头文件
起到了类型安全检查的作用。
所以可以有以下的总结:
1.所谓源文件就是单个.c文件。所谓工程就是同一个目录下的所有文件。
2.不想让其它.c文件访问的函数一定要加上static关键字。其他的函数虽然不在头文件里声明也可以被访问到,但是为了
类型安全检查我们也要最好在头文件里声明。写头文件就像写说明书一样。要养成好的编程风格