2

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

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

4

2 回答 2

6

如果这是纯 C,最简单的常见解决方案是在函数上使用与它们所应用的模块或数据结构名称相关的函数命名空间。例如

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
于 2013-02-28T00:08:01.657 回答
4

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

#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();
}

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

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

#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视为实体,而不是一堆功能。

然后你可以这样做:

stack stc;
init(stc); /*sets up the function pointers*/
stc.add(10);
stc.modify(30,0);
stc.deleteEverything(); 
于 2013-02-28T00:09:16.510 回答