我有一个 struct ST_transaction_t,它包含2个 struct 、一个枚举和uint32_t个成员,当我声明 struct ST_transaction account1时,我得到account1': undeclared identifier error.当我从 struct 中删除枚举类型的成员时,它起作用了.

以下是代码中出现问题的部分:

typedef struct ST_transaction_t
{
    ST_cardData_t cardHolderData;
    ST_terminalData_t terminalData;
    EN_transState_t transState;
    uint32_t transactionSequenceNumber;
}ST_transaction_t;
typedef enum EN_transState_t
{
    APPROVED, DECLINED_INSUFFECIENT_FUND, DECLINED_STOLEN_CARD, INTERNAL_SERVER_ERROR
}EN_transState_t;

int main() {
ST_transaction_t account1 ;
return 0;
}

如果是这样的话:

typedef struct ST_transaction_t
{
    ST_cardData_t cardHolderData;
    ST_terminalData_t terminalData;
    //EN_transState_t transState;
    uint32_t transactionSequenceNumber;
}ST_transaction_t;
typedef enum EN_transState_t
{
    APPROVED, DECLINED_INSUFFECIENT_FUND, DECLINED_STOLEN_CARD, INTERNAL_SERVER_ERROR
}EN_transState_t;

int main() {
ST_transaction_t account1 ;
return 0;
}

它工作得很好,那么为什么EN_transState_t transState会导致这个错误,以及如何修复它?

推荐答案

在您的代码中,只有在typedef struct ST_transaction_t中使用之后才声明typedef enum EN_transState_t.在C中,必须先声明所有类型,然后才能引用它.编译器自上而下地工作.

将声明typedef enum EN_transState_t移到typedef struct ST_transaction_t之前,您的代码应该可以工作.

C++相关问答推荐

try 使用libusb控制音量时LIBUSB_WRIGHT_PIPE

在严格的C89模式下,收件箱不会在' uint64_t '上发出警告

我可以动态分配具有空类型函数的矩阵吗?

在Windows上构建无聊的SSL x64

由Go调用E.C.引起的内存快速增长

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

带有sigLongjMP中断I/O的异常处理程序

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

在每种If-Else情况下执行语句的最佳方式

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

如何使用C++在控制台中以彩色打印被阻止的客户端

编译器如何处理具有更复杂值的枚举?

Caesar密码调试:输出文本末尾的问号和随机字符

与外部SPI闪存通信时是否应禁用中断?

哪些C++功能可以在外部C块中使用

将不同类型的指针传递给函数(C)

与指针的原始C数组或C++向量<;向量<;双>>;

模仿 memmove 的行为

C Makefile - 如何避免重复提及文件名

从管道读取数据时丢失