在C#中如何防止名字冲突

63lcw9qa  于 2022-12-03  发布在  C#
关注(0)|答案(2)|浏览(245)

假设我有两个文件:stack. h和queue. h。两者都希望实现函数add()。例如,如果我将stack. h和queue. h包含在同一个main. c中,就会发生冲突。
在这两个文件中实现add()函数的推荐方法是什么?

4ngedf3f

4ngedf3f1#

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

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

您的问题是关于“导出的”(公共)函数名,但也要注意,当您的.c文件有私有的helper函数时,您可以将它们标记为static,这告诉编译器它们只在该文件中使用,因此您的命名可以稍微宽松一些,因为它们在其他地方不会冲突。

zlhcx6iw

zlhcx6iw2#

如果你已经测试了一个队列和一个栈的实现,并且在其他地方引用了它,你可以做一些预处理器的技巧,如下所示:

#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看作实体,而不是函数束。
然后,您可以执行以下操作:

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

相关问题