在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) |