在C++程序中使用命名空间类方案定义C类型的使用类型
我编写了一个C库,它定义了一些函数和类型,如下所示:在C++程序中使用命名空间类方案定义C类型的使用类型,c++,c,types,namespaces,C++,C,Types,Namespaces,我编写了一个C库,它定义了一些函数和类型,如下所示: typedef struct { int i; } A; void func1(void); int func2(A* a); 现在我想使用这些函数并在C++程序中创建A类型的变量。遗憾的是C没有命名空间,但我仍然想模仿一些类似的结构来避免C++程序中的名字冲突。但是,我不喜欢在每个函数和结构前面加前缀的选项: typedef struct { int i; } library_A; void library_func1(void)
typedef struct {
int i;
} A;
void func1(void);
int func2(A* a);
现在我想使用这些函数并在C++程序中创建A类型的变量。遗憾的是C没有命名空间,但我仍然想模仿一些类似的结构来避免C++程序中的名字冲突。但是,我不喜欢在每个函数和结构前面加前缀的选项:
typedef struct {
int i;
} library_A;
void library_func1(void);
int library_func2(A* a);
我找到了一个很好的方法来模拟名称空间方案,方法是定义一个结构,该结构有一些指向函数的指针:
/*interface.h*/
struct library {
void (*func1)(void);
void (*func2)(A*);
};
extern const struct library Library;
/* end interface.h */
/* interface.c */
#include "interface.h"
void func1(void)
{
...
}
void func2(A* a)
{
...
}
const struct library Library = {
.func1 = func1,
.func2 = func2,
};
/* end interface.c */
/* C++ program */
#include "interface.h"
int main(void)
{
Library.method1();
A a;
a.i = 5;
Library.method2(&a);
return 0;
}
/* end C++ program */
是否可以将库中的A类型定义为不同的类型,也可以使用C++中定义的类型库A,并且可以将C++程序写成< /P>
#include "interface.h"
int main(void)
{
Library.method1();
Library.A a;
a.i = 5;
Library.method2(&a);
return 0;
}
据我所知,这是不可能的 但是,我不喜欢在每个函数和结构前面加前缀的选项 不过,这是处理这种情况的正确方法。可以这样想:名称空间也可以作为前缀,不同之处在于它使用了双冒号,而不是下划线 从用户的角度来看,您使用全局库的方法令人惊讶。作为用户,我的第一个问题是: 我不应该直接使用库函数有什么技术原因吗 如果除了开发人员您之外,没有其他原因不喜欢library_XYZ的外观,那么我的下一个想法是: 毫无意义的古怪。库开发人员没有认真对待这一点,或者没有经验
还有一件事,无论何时从库中添加、删除或重命名内容,都需要额外维护库助手结构。更新该全局函数最终将成为一个负担。还有另一个问题:库用户不能使用Library.func的地址初始化具有静态存储持续时间的函数指针,但Library_func可以。这限制了库的使用方式。