Chinaunix首页 | 论坛 | 博客
  • 博客访问: 285199
  • 博文数量: 65
  • 博客积分: 3091
  • 博客等级: 中校
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2005-01-25 09:44
文章存档

2013年(2)

2012年(11)

2011年(12)

2010年(13)

2009年(15)

2008年(12)

分类: C/C++

2008-08-24 16:46:44

    在C语言中,全局变量和函数是外部可见的。因此,在构建动态(共享)库时,它们都被缺省的导出。程序员有时候需要指定导出一部分全局符号时,在MS的C开发环境中通过__declspec来达到目的,或者在GNU C的开发环境中,通过__attribute__(visibility)来实现。其实,可以把C语言语法的意义稍微做些更改,似乎就可以简单的实现这个目的:
1。在全局作用域内:
  int a;                   语义更改为声明(非定义,不分配存储空间)了一个全局变量
  int a = 0;               语义更改为当作 static int a = 0; 的缺省形式来进行语法分析
  extern int a;            语义更改为当作定义(此时分配存储空间)全局变量,
                           同时指明为导出符号使外部可见。
  extern int a = 0;        视作定义并初始化,同时指明为导出符号使外部可见。
2。局部作用域内(函数块内)的语义不改变:
  int a;                   声明并定义(分配存储空间),相当于 auto int a; 的缺省形式
  static int a;            声明并定义静态变量
  register int a;          声明并定义静态变量
3。域修饰符
  extern a                 定义为指定访问全局作用域内的变量
  static a                 定义为指定访问编译体域内的变量
  a                        定义为 auto a 的缺省形式,指定访问局部作用域内的变量 a
  如:
  extern a = 0;
  static a = extern a;
  a = static a;
  auto a++;
4。全局函数的导入导出
   type function( params );     语义不改变,视为声明了一个全局函数。
   type function( params ) {}   语义更改为当作 static type function( params ) {}
                                的缺省形式,来进行语法分析,即视为定义了一个编译体作用域内
                                的非导出的静态函数,对外部是不可见的。
   extern function( params ) {} 视作定义了一个全局可见的函数,编译时导出该函数的符号。
  
  相应的,连接规则可定义为:先在编译体内找静态定义;若未找到,则在全局域内查找(相当于导入)。
  在上述的语义环境下,程序编码可以被简化很多。只要在头文件中写上声明的语句,在实现文件中定义全局符号,则可以顺利的实现全局符号的导入导出。例:
文件 header.h
int a, b;
int A(int a);
文件 a.c
#include "header.h"
extern int a = 0;
int a = 1;
extern int function(int a)
{
    extern a = a + b;  /* extern a = auto a + global b */
    return (static a = extern ++a);
}
文件 b.c
#include "header.h"
extern b = 0;
int function(int a)
{
    return 0;
}
extern int main()
{
    return function(0) + extern function(0);  /* return static function(0) + \
                                                 extern function(0) */
}

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