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

Gra*_*ent 1 c namespaces collision

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

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

Ani*_*nge 7

如果您已经测试了队列和堆栈实现,并在其他地方引用过..您可以执行一些预处理器技巧,如下所示:

#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();
}
Run Code Online (Sandbox Code Playgroud)

我的建议是 - 重构代码库以使用不冲突的命名约定,而不是像addandsubtract等通用函数名称。

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

#define TYPE int

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

并在该init(stack)方法中,将add(),modify()和分配deleteEverything()给没有名称冲突的不同函数(队列也是如此)

然后你开始将stackqueue视为实体而不是一堆函数。

然后你可以这样做:

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

  • @KeithNicholas 是的 - 但如果他已经定义了堆栈和队列,他将不得不做一些丑陋的事情。这样他就不会破坏使用“stack.h”或“queue.h”的代码的其他部分 (2认同)

Ben*_*tto 5

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

stack_add(...)
queue_add(...)
Run Code Online (Sandbox Code Playgroud)

您将在几乎所有大型纯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
Run Code Online (Sandbox Code Playgroud)