当前位置: 首页 > news >正文

【static、extern、头文件】static、extern、头文件的一点总结

关于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关键字。其他的函数虽然不在头文件里声明也可以被访问到,但是为了
类型安全检查我们也要最好在头文件里声明。写头文件就像写说明书一样。要养成好的编程风格

相关文章:

  • 【strstr()函数的局限】strstr()检测不到存在的字符/数据/strcmp, strncmp和memcmp
  • 【ZIGBEE资料】zigbee资料下载
  • 【指针有效性】指针有效性的有效性检测的必要性!!
  • 【GPRS透明传输】GPRS透明传输
  • 【GPRS拨号错误】GPRS 某条指令一直ERRO
  • 【IAR编译和单片机】IAR编译和单片机的一些积累
  • 【C++】C++获取系统日期时间
  • 【单片机重启】MSP430重启/频繁重启/跑飞 原因分析
  • 【堆和栈的区别】堆heap 和栈stack有什么区别(代码区、常量区、静态区(全局区)、堆区、栈区)...
  • 【MODBUS】 协议
  • 【单机片调试】开发调试MSP430 遇到的问题总结
  • 【单片机程序和RAM】程序在RAM中调试的运行方式程序固化后运行方式
  • 【关于单片机的N多问题】关于单片机的N多问题
  • 【volatile关键字】 详解C中volatile关键字(IAR 优化等级问题)
  • 【下载进去无法运行】MSP430 程序能下载进去却无法运行
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2017前端实习生面试总结
  • canvas 高仿 Apple Watch 表盘
  • EOS是什么
  • If…else
  • iOS小技巧之UIImagePickerController实现头像选择
  • JS笔记四:作用域、变量(函数)提升
  • Puppeteer:浏览器控制器
  • Python 反序列化安全问题(二)
  • 从零开始学习部署
  • 关于for循环的简单归纳
  • 简析gRPC client 连接管理
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 码农张的Bug人生 - 见面之礼
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 浅谈web中前端模板引擎的使用
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 思否第一天
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 用mpvue开发微信小程序
  • 正则表达式
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​secrets --- 生成管理密码的安全随机数​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #include<初见C语言之指针(5)>
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (笔试题)分解质因式
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (排序详解之 堆排序)
  • (三分钟)速览传统边缘检测算子
  • (一) springboot详细介绍
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)socket Aio demo
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .h头文件 .lib动态链接库文件 .dll 动态链接库