重新定义嵌套结构

时间:2014-08-14 19:32:28

标签: c struct declaration

我正在使用 asn1c 转换后的代码,该代码使用了我的ASN.1代码并将其转换为C,其中包含大量复杂类型和structs已经宣布。目前,我收到了这个错误:

  

BACnetFaultParameter.h:125:11:错误:重新定义'struct   list_of_fault_values'BACnetFaultParameter.h:78:11:注意:最初   这里定义

我当前的代码如下所示(请注意,这些代码块是.h文件,包含在同名的.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的成员”

<{1>}文件中的

.c是本地结构,但它的行为就像一个全局的,运行grep并没有指出任何可能的问题。我的问题是。有人有想法吗?或者以前有人遇到类似的东西?

这是包含list_of_fault_values语句的代码

#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;

2 个答案:

答案 0 :(得分:0)

您使用#ifndef得到了正确的想法,但仍需要声明list_of_fault_values,即使已经声明了结构。

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

#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

答案 1 :(得分:0)

结构定义不依赖于彼此。当没有名称_LIST_OF_FAULT_VALUES时,定义第一个结构。当没有名称

时定义第二个结构
_LIST_OF_FAULT_PARAMETERS

没有什么可以阻止两种定义共存。

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