Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58359
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 101
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-07 19:38
文章分类

全部博文(25)

文章存档

2014年(25)

我的朋友

分类: C/C++

2014-06-23 05:41:13

C源文件和H头文件的组织
这两类文件的构成主要包含以下4部分:

1、文件的基本信息部分,包括版权/版本信息、文件名、作者、功能简介、创建日期和文件更新日志记录等

2、引用或相关联的部分,包括嵌入引用的其他文件

3、预定义部分,包括常数定义、类型定义、变量说明和定义、函数原型说明等

4、文件主体描述部分,仅C源文件具有该部分,包括每一个函数的具体实现

函数/变量 声明/定义的位置

如果模块 2 要引用模块 1 中定义的函数,需要做2件事:
1、模块1的头文件中声明函数(不是定义)
2、模块2包含模块1的头文件(当然,模块1也要包含自己的头文件)

Ex:

  1. File1.h
  2. =================
  3. extern void file1_func(void); // 声明
  1. File1.c
  2. =================
  3. #include "File1.h"
  4. void f1_func(void) // 定义模块内函数
  5. {
  6. }

  7. void file1_func(void) // 定义全局函数
  8. {
  9.  f1_func(); // 调用本模块内的函数
  10. }
  1. File2.c
  2. =================
  3. #include "file1.h"

  4. void main()
  5. {
  6.       file1_func(); // 引用模块1中的函数

  7.       // f1_func(); // error! f1_func() is private in module1.

  8. }


存储类型关键字:extern、private、auto、register

extern
声明对象(函数、变量)的存储类型为 extern。即 对象在其它模块定义。
编译原理-模块单独编译,然后连接为可执行文件。当模块2引用模块1中的对象object时,需要先用extern关键字声明object,这样编译模块2时不会产生编译错误。
为了保证公共对象定义和声明的唯一性,通常将模块(例如 Module1)内需要与其它模块(例如 ModuleElse)公用的对象在自己的头文件(即Module1.h)中用 extern 声明,其它需要引用本模块公用对象的模块需要先包含本模块的头文件(即Module1.h)。

static
功能1:限制对象作用域于本模块
C语言的函数、全局变量(函数外定义的变量)默认是public属性的,其它模块可引用本模块的函数/全局变量(参extern一节)。如果要限制对象(函数、全局变量)的可见范围在本模块内,则使用关键字 static。
功能2:定义局部变量存储类型为静态
被static修饰的局部变量 可见域是局部的,生存期和程序相同。在程序进入其作用域时初始化一次,其值在程序再次进入作用域时有效。

auto
局部变量默认存储类型是 auto。这个关键字你可以当它不存在。

register
register修饰的局部变量被建议分配在寄存器中,可提高频繁访问变量的效率。


阅读(759) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~