C 不支持 C++ 等命名空间。 C++ 命名空间的实现会破坏名称。下面概述的方法允许您在 C++ 中使用名称空间的好处,同时具有未损坏的名称。我意识到问题的本质是为什么 C 不支持命名空间(一个简单的答案是它不支持,因为它没有实现:))。我只是认为它可能会帮助别人了解我是如何实现模板和命名空间的功能的。
我写了一篇关于如何使用 C 来利用命名空间和/或模板的教程。
Namespaces and templates in C
Namespaces and templates in C (using Linked Lists)
对于基本命名空间,可以简单地作为命名空间名称的前缀作为约定。
namespace MY_OBJECT {
struct HANDLE;
HANDLE *init();
void destroy(HANDLE * & h);
void do_something(HANDLE *h, ... );
}
可以写成
struct MY_OBJECT_HANDLE;
struct MY_OBJECT_HANDLE *my_object_init();
void my_object_destroy( MY_OBJECT_HANDLE * & h );
void my_object_do_something(MY_OBJECT_HANDLE *h, ... );
我需要的第二种使用命名空间和模板概念的方法是使用宏连接和包含。例如,我可以创建一个
template<T> T multiply<T>( T x, T y ) { return x*y }
使用模板文件如下
乘法模板.h
_multiply_type_ _multiply_(multiply)( _multiply_type_ x, _multiply_type_ y);
multiply-template.c
_multiply_type_ _multiply_(multiply)( _multiply_type_ x, _multiply_type_ y) {
return x*y;
}
我们现在可以定义 int_multiply 如下。在本例中,我将创建一个 int_multiply.h/.c 文件。
int_multiply.h
#ifndef _INT_MULTIPLY_H
#define _INT_MULTIPLY_H
#ifdef _multiply_
#undef _multiply_
#endif
#define _multiply_(NAME) int ## _ ## NAME
#ifdef _multiply_type_
#undef _multiply_type_
#endif
#define _multiply_type_ int
#include "multiply-template.h"
#endif
int_multiply.c
#include "int_multiply.h"
#include "multiply-template.c"
在所有这一切结束后,您将拥有一个函数和头文件。
int int_multiply( int x, int y ) { return x * y }
我在提供的链接上创建了一个更详细的教程,展示了它如何与链接列表一起工作。希望这可以帮助某人!