C语言中命名空间的实现

foobar.h

 1 // inclusion guard
 2 #ifndef FOOBAR_H_
 3 #define FOOBAR_H_
 4
 5 //// long names
 6 //int foobar_some_func(int);
 7 //void foobar_other_func();
 8 int some_func(int);
 9 void other_func();
10
11 // short names
12 #ifdef NAMESPACE foobar
13 #define some_func(...) foobar_some_func(__VA_ARGS__)
14 #define other_func(...) foobar_other_func(__VA_ARGS__)
15 #endif
16
17 #endif

foobar.c

 1 #define NAMESPACE foobar
 2
 3 #include "stdio.h"
 4 #include "foobar.h"
 5
 6
 7
 8
 9 int some_func(int a)
10 {
11     return a + 99;
12 }

goobar.h

 1 // inclusion guard
 2 #ifndef GOOBAR_H_
 3 #define GOOBAR_H_
 4
 5 //// long names
 6 //int foobar_some_func(int);
 7 //void foobar_other_func();
 8
 9 // short names
10 #ifdef NAMESPACE goobar
11 #define some_func(...) goobar_some_func(__VA_ARGS__)
12 #define other_func(...) goobar_other_func(__VA_ARGS__)
13 #endif
14
15 #endif

goobar.c

 1 #define NAMESPACE goobar
 2 #include "stdio.h"
 3 #include "goobar.h"
 4
 5
 6
 7
 8 int some_func(int a)
 9 {
10     return a + 8;
11 }

main.c

 1 #define NAMESPACE goobar
 2 #define NAMESPACE foobar
 3
 4
 5 #include "stdio.h"
 6
 7 #include "goobar.h"
 8 #include "foobar.h"
 9
10
11 //http://stackoverflow.com/questions/389827/namespaces-in-c
12 void main()
13 {
14     int val = goobar_some_func(12);
15     printf("value = %d\n", val);
16
17     val = some_func(12);
18     printf("value = %d\n", val);
19
20     return;
21 }

时间: 2024-08-24 19:07:45

C语言中命名空间的实现的相关文章

javascript语言中的毒瘤(上)

javascript语言中的毒瘤(上) 最近翻了<javascript语言精髓>,对js有了更进一步的了解,特别是js的糟糕特性,下面,结合书中的要点,给大家分享一下js的几个糟糕特性. 全局变量 全局变量实在所有作用域均可以访问的变量,在一些小型项目中全局变量给我们获取和使用函数,数据等提供了灵活,便捷:但是随着程序的越来越庞大,全局变量就变得越来越难维护:(因为一个变量可能会在很多地方被修改,还有可能被覆盖),一旦出现问题也很难定位和调试. Js的问题不仅在于它容许使用全局变量,而且在于它

C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

目录 00 简介 01 算法概述 02 公用方法 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存的忙闲状态,为进程分配和释放内存.当主存的空间太小而无法装入所有的进程时,就需要在内存和硬盘之间进行调度操作. 多数操作系统只采用某种特定的页面置换算法进行置换,无法预先探测当前运行进程的页面访问模式,因此不能根据不同的页面访问模式,选用不同的页面置换算法.当然,如果能对不同的访问模式选取相应的页面置换算法,

转:C++中命名空间污染注意点 blog.sina.com.cn/s/blog_af68a2c201015pqo.html

一. 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突. 在 C语言中定义了3个层次的作用域,即文件(编译单元).函数和复合语句.C++又引入了类作用域,类是出现在文件内的.在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们. 1.全局变量的作用域是整个程序,在同一作用域中不应有两个或多个同名的实体(enuty),包括变量.函数和类等. 例:如果在文件中定义了两个类,在这两个类中可以有同名的函数.在引用时,为了区

unity3d脚本语言中的引用类型

在之前的文文里有说到,值类型和引用类型,那么这会就单独说下引用类型: Unity3D中的C#语言提供了专门的类型来为开发者提供使用C#开发游戏的便利条件: 在该引擎中,使用UnityEngine命名空间来盛放自己定义的类型.其中,UnityEngine.Object类该游戏引擎的C#脚本语言中最基本的类,也就是所有对象的基类.所有派生自该类的公开变量都会显示在监视器(Inspector)视图中. 该类提供的类成员: 字段 hideFlags 标识该对象是否被隐藏[我用的2017版本的,都返回的是

C 语言的命名空间

C语言也有命名空间,可分位4类命名空间. 4类命名空间: 所有的标签(label)都属于同一个命名空间.说明:①在同一个函数内,你的标签不能相同.②在同一个函数内,标签可以和其他变量名称相同.因为它们所属的命名空间不同. struct.enum和union的名称,在 C99 中称之为 tag,所有的 tag 属于同一个命名空间.也就是说,如果你已经声明struct A { int a }; 就不能再声明union A{ int a };了.之所以让所有的 tag 组成一个命名空间,由于 tag

从头开始-04.C语言中流程控制

分支结构: if语句:当条表达式满足的时候就执行if后面大括号中语句 三种格式: if,if else , if else if else 特点:1.只有一个代码块会被执行 2.若有else那么必有一个代码会被执行 3.一个if语句中只能以if开头,最多只能有一个else,可以有任意个else if switch(表达式){ case 常量: ... break; case 常量1: ... break; default: ... break; } : 使用场景:当一个变量只有几个固定的取值的时

sqlite学习笔记8:C语言中使用sqlite之创建表

前面已经说了如何打开和关闭数据库,这次要说得是如何执行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg) 参数: db:已经打开的数据库实例 sql:SQL语句,是一个字符串 callback:是一个回调函数 data:做为回调函数的第一个参数 errmsg:用于带回错误信息 该回调函数有两种返回值类型. 1.返回

C语言中内存的管理

一  Handler作用和概念 包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙. 1.运行在某个线程上,共享线程的消息队列: 2.接收消息.调度消息,派发消息和处理消息: 3.实现消息的异步处理: Handler能够让你发送和处理消息,以及Runnable对象:每个Handler对象对应一个Thread和Thread的消息队列.当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以传递消息和runnable对象到消息队列中,执行消息

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型