gpt4 book ai didi

c - 嵌套Struct的重新定义

转载 作者:行者123 更新时间:2023-11-30 17:30:04 25 4
gpt4 key购买 nike

我正在使用 asn1c 转换后的代码,它采用了我的 ASN.1 代码并将其转换为 C,这样,就有了一整套复杂的类型和结构已声明。目前,我收到此错误:

BACnetFaultParameter.h:125:11: error: redefinition of ‘struct list_of_fault_values’ BACnetFaultParameter.h:78:11: note: originally defined here

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

 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 语句,然后我收到错误消息

"Fault state has no member named 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 的想法是正确的,但仍然需要声明 list_of_fault_values,即使该结构已经声明。

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

#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

关于c - 嵌套Struct的重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com