【问题标题】:Redefinition of nested Struct嵌套结构的重新定义
【发布时间】:2014-08-14 19:32:27
【问题描述】:

我正在使用 asn1c 转换的代码,它采用了我的 ASN.1 代码并将其转换为 C,因此声明了一大堆复杂类型和 structs .目前,我收到此错误:

BACnetFaultParameter.h:125:11: 错误: 重新定义‘struct list_of_fault_values’ BACnetFaultParameter.h:78:11: 注意:原来 在这里定义

我当前的代码如下所示(请注意,这些代码块是 .hfiles,它们包含在同名的 .c 文件中):

 typedef struct BACnetFaultParameter {
    BACnetFaultParameter_PR present;
    union BACnetFaultParameter_u {
            NULL_t   none;
            struct fault_characterstring {

                    struct list_of_fault_values {
                            A_SEQUENCE_OF(CharacterString_t) list;

                            /* Context for parsing across buffer boundaries */
                            asn_struct_ctx_t _asn_ctx;
                    } list_of_fault_values;

                    /* Context for parsing across buffer boundaries */
                    asn_struct_ctx_t _asn_ctx;
            } fault_characterstring;

然后在代码中的几行,我被告知我正在重新声明struct list_of_fault_values

                 struct fault_state {

                    struct list_of_fault_values {
                            A_SEQUENCE_OF(struct BACnetPropertyStates) list;

                            /* Context for parsing across buffer boundaries */
                            asn_struct_ctx_t _asn_ctx;
                    } list_of_fault_values;
                  /* Context for parsing across buffer boundaries */
                    asn_struct_ctx_t _asn_ctx;
            } fault_state;

让我感到困惑的是,我在两个代码块周围都使用了 #ifndef#define 语句,然后我收到错误提示

“故障状态没有名为 list_of_fault_values 的成员”

.c 文件中。 list_of_fault_values 是本地结构,但它的行为就像一个全局的、运行的 grep 也没有指出任何可能的问题。我的问题是。有人有想法吗?或者有没有人遇到过类似的事情?

这是带有#ifndef 语句的代码

                   struct fault_characterstring {
    #ifndef _LIST_OF_FAULT_VALUES
    #define _LIST_OF_FAULT_VALUES
            struct list_of_fault_values {
                            A_SEQUENCE_OF(CharacterString_t) list;

                            /* Context for parsing across buffer boundaries */
                            asn_struct_ctx_t _asn_ctx;
                    } list_of_fault_values;
                    #endif
             /* Context for parsing across buffer boundaries */
                    asn_struct_ctx_t _asn_ctx;
            } fault_characterstring;

      #ifndef _LIST_OF_FAULT_PARAMETERS
    #define _LIST_OF_FAULT_PARAMETERS
                    struct list_of_fault_values {
                            A_SEQUENCE_OF(struct BACnetPropertyStates) list;

                            /* Context for parsing across buffer boundaries */
                            asn_struct_ctx_t _asn_ctx;
                    } list_of_fault_values;
                    #endif
                     /* Context for parsing across buffer boundaries */
                    asn_struct_ctx_t _asn_ctx;
            } fault_state;

【问题讨论】:

  • 你的#ifndef 语句是什么样的?
  • 我在帖子问题中添加了“#ifndef”

标签: c struct declaration


【解决方案1】:

使用#ifndef 的想法是正确的,但list_of_fault_values 仍然需要声明,即使结构已经声明。

为简单起见,您可以在#endif 之前添加一个#else 块:

#ifndef HAVE_LIST_OF_FAULT_PARAMETERS // NB: you shouldn't use a leading underscore for macros
#define HAVE_LIST_OF_FAULT_PARAMETERS
    struct list_of_fault_values {
        ...
    } list_of_fault_values;
#else // just use the previous definition
    struct list_of_fault values list_of_fault_values;
#endif

【讨论】:

    【解决方案2】:

    结构定义不相互依赖。第一个结构是在没有名称_LIST_OF_FAULT_VALUES 时定义的。第二个结构是在没有名字的时候定义的

    _LIST_OF_FAULT_PARAMETERS
    

    没有什么能阻止这两种定义共存。

    您必须在要选择其中一个的结构的两个定义之前定义自己的清单常量 _LIST_OF_FAULT_VALUES_LIST_OF_FAULT_PARAMETERS

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多