在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)

我编写了一个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);
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可以。这限制了库的使用方式。