C语言,模拟命名空间的方法

来源:互联网 发布:现代h6行车记录仪软件 编辑:程序博客网 时间:2024/05/17 07:49

C语言中没有单独的命名空间的定义. 所以, 通常会把函数,结构体的名字命名的很长, 加上前缀, 依次来防止命名冲突.  通过一些探索,我发现通过C语言现有的语法, 是可以在一定层面上来模拟命名空间定义的.

一目了然看代码:

#include <stddef.h>#include <stdio.h>#include <malloc.h> typedef struct {     struct {        int a;        int b;    }* ClassA; } NameSpace; static NameSpace ANameSpace; void main() {     ANameSpace.ClassA = malloc(sizeof(*ANameSpace.ClassA));     ANameSpace.ClassA->a = 100;    ANameSpace.ClassA->b = 100;    printf("%d, %d", ANameSpace.ClassA->a, ANameSpace.ClassA->b); }

定义了一个NameSpace的结构体来做命名空间.  ClassA就是我们需要定义的类, 需要注意的是, ClassA是一个匿名结构体的指针. ClassA响应的结构体没有名字. 我们可以通过NameSpace 来访问这个匿名结构体指针.


生成这个结构体的时候,我们用到了sizeof运算来计算, 匿名结构体的内存空间大小.  我们只用这个ClassA空间的时候,必须要用ANameSpace.ClassA这个形式, 只有这样编译器才知道这个匿名结构的内存布局.

 

那么如何定义栈空间的匿名对象呢?

char c[sizeof(*ANameSpace.ClassA)]; ANameSpace.ClassA = c;ANameSpace.ClassA->a = 100;ANameSpace.ClassA->b = 100;printf("%d, %d", ANameSpace.ClassA->a, ANameSpace.ClassA->b);

sizeof是编译期运算,所以可以用作数组的长度. 我们申请了匿名ClassA的空间布局, 以后强转到ANameSpace.ClassA 去操作这个对象.

 

最后, 由此可见. 这样的技巧确实模拟了命名空间. 我们可以把所有的类定义都放到一个结构体里面. 缺点也是显而易见, 就是所有的定义都必须放到一个文件里面, 不利于模块化管理.

还有一个问题, 就是访问这个匿名结构定义的时候, 只能通过命名空间结构体的指针来访问, 有点不方便, 总是需要进行复制操作.


0 0
原创粉丝点击