你如何防止名字在C中发生碰撞

时间:2013-02-28 00:06:26

标签: c namespaces collision

假设我有两个文件:stack.h和queue.h。两者都想实现add()函数。例如,如果我在同一个main.c中包含stack.h和queue.h,则会发生冲突。

在两个文件中实现add()函数的推荐方法是什么?

2 个答案:

答案 0 :(得分:5)

如果这是纯C,最简单的常见解决方案是在相对于它们适用的模块或数据结构名称的函数上使用自己动手的命名空间。 e.g。

stack_add(...)
queue_add(...)

您将在几乎所有大型纯C项目中找到相关示例:

pthread_mutex_lock() // POSIX/UNIX, used for locking a mutex
CGRectMake()         // iOS, used to fill in a CGRect structure
RtlZeroMemory()      // WinNT, "Rtl" indicates the module it belongs to

答案 1 :(得分:2)

如果你已经测试了队列和堆栈实现,并在其他地方引用过..你可以做一些像这样的预处理器技巧:

#define _STACK
#define _QUEUE

#ifdef _QUEUE
#define add queue_add
  #include "queue.h"
#undef add
#endif

#ifdef _STACK
#define add stack_add
  #include "stack.h"
#undef add
#endif

int main()
{
   stack_add();
   queue_add();
}

我的建议是 - 重构代码库以使用非冲突命名约定而不是通用函数名称,如addsubtract以及其他。

如果你是面向对象编程风格的粉丝,喜欢整个“添加”,“修改”概念,那么在队列和堆栈结构中使用函数指针。

#define TYPE int

typedef struct tagStruct{
   TYPE *dataBuffer;
   void (*add)(TYPE data);
   void (*modify)(TYPE data, int index);
   void (*deleteEverything)()
}stack;

并在init(stack)方法中,将add()modify()deleteEverything()分配给没有名称冲突的不同函数(同样用于队列)

然后您开始将stackqueue视为ENTITIES而不是功能串。

然后你可以这样做:

stack stc;
init(stc); /*sets up the function pointers*/
stc.add(10);
stc.modify(30,0);
stc.deleteEverything();