C语言:在另一个文件中使用main.C文件中定义的枚举变量和类型时出现问题

C语言:在另一个文件中使用main.C文件中定义的枚举变量和类型时出现问题,c,enums,global,C,Enums,Global,我在main.c文件中定义了以下枚举和变量: enum state_codes { S0, S1, S2, S3, S4, S10, S20, S30, S40, S50, S60, S70, S80, fail, fsmError }; enum state_codes

我在main.c文件中定义了以下枚举和变量:

enum state_codes {  S0,
        S1,
        S2,
        S3,
        S4,
        S10,
        S20,
        S30,
        S40,
        S50,
        S60,
        S70,
        S80,
        fail,
        fsmError
};

enum state_codes cur_state = S0;
enum state_codes old_state = S0;
在我的项目的另一个文件(名为othercode.c)中,我必须在中断处理程序中使用cur_state变量和枚举中列出的值,因此我在othercode.c文件的顶部编写了以下声明:

第一个警告与声明有关:

extern enum state_codes;

另外两个错误是我用信号发送到代码中的那一行的函数,您不能定义
enum
type
extern
,因为其他编译单元需要知道其大小写的值。也就是说,将其放在标题中:

enum state_codes {  S0,
        // …
        fsmError
};

并使用
enum state\u code
包含所有文件的头。变量仍然可以是
extern
,例如
extern enum state\u codes cur\u state

enum
类型
extern
本身无法定义,因为其他编译单元需要知道其大小写的值。也就是说,将其放在标题中:

enum state_codes {  S0,
        // …
        fsmError
};

并使用
enum state\u code
包含所有文件的头。变量仍然可以是
extern
,例如
extern enum state\u codes cur\u state
.h
文件中定义它,然后将该文件包含在使用它的所有
.c
文件中


在我看来,这是最正确的方法

.h
文件中键入def,然后#将此文件包含在使用它的所有
.c
文件中


在我看来,这是最正确的方法

extern
不提供单个
enum
值的可见性。您需要将
enum
放入一个标题中,并将其包含在您使用它的任何位置。谢谢,我刚编辑完就看到了您的答案!
extern
不提供单个
enum
值的可见性。您需要将
enum
放入一个标题中,并将其包含在您使用它的任何位置。谢谢,我刚编辑完就看到了您的答案!如果这看起来不清楚,考虑一下我是否用<代码> EnUM <代码>创建了一个库,并且只发送了一个包含“代码> ExtEnEnm StuteSoC代码”的标题;代码>和已编译的二进制库。您或编译器将如何使用这些案例,例如
S0
,甚至知道它们的存在?(这与<代码> >定义< /代码>的情况没有什么不同)。如果这不清楚,请考虑我是否用<代码> EnUM < /C>编写了一个库,并且只发送了一个包含“代码> ExtEnEnStuteSyx代码”的标题;代码>和已编译的二进制库。您或编译器将如何使用这些案例,例如
S0
,甚至知道它们的存在?(这与
#define
'd案例没有太大区别。)
typedef
在这里不相关(问题中未提及),本身也没有任何帮助。
typedef
在这里不相关(问题中未提及),本身也没有任何帮助。
extern enum state_codes;
enum state_codes {  S0,
        S1,
        S2,
        S3,
        S4,
        S10,
        S20,
        S30,
        S40,
        S50,
        S60,
        S70,
        S80,
        fail,
        fsmError
};
extern enum state_codes cur_state;
enum state_codes {  S0,
        // …
        fsmError
};