我正在使用 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
语句,然后我收到并错误地说
<{1>}文件中的“故障状态没有名为list_of_fault_values的成员”
。 .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;
答案 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
。