如何防止C语言中的名称冲突

如何防止C语言中的名称冲突,c,namespaces,collision,C,Namespaces,Collision,假设我有两个文件:stack.h和queue.h。两者都希望实现函数add()。例如,如果我在同一个main.c中包含stack.h和queue.h,就会发生冲突 在两个文件中实现add()函数的推荐方法是什么?如果这是纯C,最简单的常见解决方案是在函数上使用自己动手的名称空间,相对于它们应用的模块或数据结构的名称。e、 g stack_add(...) queue_add(...) 在几乎所有大型pure-C项目中都可以找到这样的例子: pthread_mutex_lock() // POS

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


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

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

stack_add(...)
queue_add(...)
在几乎所有大型pure-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,最简单的常见解决方案是在函数上使用自己动手的名称空间,与它们应用的模块或数据结构的名称相对应。e、 g

stack_add(...)
queue_add(...)
在几乎所有大型pure-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

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

#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();
}
我的建议是——重构代码库,使用非冲突命名约定,而不是像
add
subtract
等通用函数名

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

#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()
deleteethings()
分配给没有名称冲突的不同函数(同样适用于队列)

然后,您开始将
堆栈
队列
视为实体,而不是一堆函数

然后,您可以执行以下操作:

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

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

#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();
}
我的建议是——重构代码库,使用非冲突命名约定,而不是像
add
subtract
等通用函数名

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

#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()
deleteethings()
分配给没有名称冲突的不同函数(同样适用于队列)

然后,您开始将
堆栈
队列
视为实体,而不是一堆函数

然后,您可以执行以下操作:

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

正如其他答案所说,正如在任何编程语言中一样,您包含的所有库都必须有一个带有您接受的专用名称的合理设计。否则,在任何编程语言中都会发生冲突。例如,如果您包含一个标题“terribad.h”,它恰好保留了这个星球上的所有变量,那么您可能需要重新考虑在您的项目中包含“terribad.h”。正如其他答案所说,以及在任何编程语言中,您包含的所有库都必须有一个带有您接受的专用名称的合理设计。否则,在任何编程语言中都会发生冲突。例如,如果您包含一个标题“terribad.h”,它恰好保留了地球上的所有变量,那么您可能需要重新考虑在您的项目中包含“terribad.h”。有关C名称空间的想法,请参见此问题,尽管我认为这有点过分:有关C名称空间的想法,请参见此问题,虽然这有点过分:@KeithNicholas是的-但如果他已经定义了堆栈和队列,他将不得不做一些丑陋的事情。这样他就不会破坏使用
stack.h
queue.h
@KeithNicholas的代码的其他部分是的-但是如果他已经定义了stack和queue,他将不得不做一些丑陋的事情。这样他就不会破坏使用
stack.h
queue.h