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
- C语言,模拟命名空间的方法
- C语言如何调用不同文件的方法(同一命名空间)
- C语言命名空间详解
- c语言中的命名空间
- c语言命名方法
- C语言命名空间与定义变量
- 【C++】基础知识—与C语言关系、命名空间
- C/C++:命名空间
- C语言利用libxml2的xPath解析XML时,默认命名空间的处理
- Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
- Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
- Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
- Asp.net .net(C#) 获取当前命名空间,类名,方法名的方法
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型(上)
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型(下)
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型(上)
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型
- C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型(上)
- 山东省赛题 NEU OJ 1444 线段树双标记
- ubuntu 从桌面登录切换回文本登录
- UVA 10271 Chopsticks
- VC中置顶窗口的方法
- Round Robin 轮叫调度
- C语言,模拟命名空间的方法
- Thinkphp中eq,neq,gt,lt等表达式缩写
- UVA1339- Ancient Cipher
- HDU 2031 进制转换
- too many open files的处理方法
- 刘颖:打造高质量的云服务
- HDU1698_Just a Hook
- Python Tkinter 事件和映射
- jquery制作select列表双向选择