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

问题描述 投票:4回答:1

我有一些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) {
// ...
c++ c interop
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.