C和C ++标头:在另一个结构中定义全局结构

时间:2019-03-27 19:54:33

标签: c++ c interop

我有一些C代码,其中的某些结构如下所示:

typedef struct my_library_a_t my_library_a_t;
typedef struct my_library_b_t my_library_b_t;
typedef struct my_library_c_t my_library_c_t;

struct my_library_a_t {
    struct my_library_b_t {
        int data;
        struct my_library_c_t {
            int data;
        } c;
    } b;
    int data;
};

这在C ++中不起作用,因为在C struct my_library_b_t中定义了全局struct my_library_b_t,而在C ++中定义了::my_library_a_t::my_library_b_t

如何获取内部结构定义以在C ++中定义全局结构?甚至不必更改太多代码即可工作(我不介意拥有#ifdef __cplusplus块,但我不想拔出这些结构,因为它们嵌套在第一位的原因是它们每次仅使用一次,并且当内部类定义高于外部类定义时,真的很难阅读

我在定义中尝试了struct ::my_library_b_t,但这不起作用。

对于上下文,我正在解析一个具有如下定义的字符串:

a     = b "," data
b     = data "," c
c     = data
data  = %x31-39 *DIGIT  ; 1-9 followed by *(0-9)
      / "0"

并且中间部分具有含义,因此能够具有采用my_library_b_t*my_library_c_t*的函数很有用。

我希望有一个像这样的解决方案:

#ifdef __cplusplus
#define GLOBAL_STRUCT(name) ???  (I tried `:: name`)
extern "C" {
#else
#define GLOBAL_STRUCT(name) name
#endif

struct my_library_a_t {
    struct GLOBAL_STRUCT(my_library_b_t) {
// ...

1 个答案:

答案 0 :(得分:1)

我推荐这个

struct my_library_a_t {
    struct my_library_b_t {
        int data;
        struct my_library_c_t {
            int data;
        } c;
    } b;
    int data;
};
#ifdef __cplusplus
    typedef struct my_library_a_t::my_library_b_t my_library_b_t;
    typedef struct my_library_b_t::my_library_c_t my_library_c_t;
#else
    typedef struct my_library_a_t my_library_a_t;
    typedef struct my_library_b_t my_library_b_t;
    typedef struct my_library_c_t my_library_c_t;
#endif

请注意,在别名为my_library_b_t之后,您无需使用my_library_a_t :: my_library_b_t :: my_library_c_t