我想定义一个枚举类型 ONCE 并在我包含该文件时让该类型在所有其他文件之间共享,但是我不断收到以下错误:
$ gcc -std=c99 main.c invoc.h invoc.c
main.c: In function ‘main’:
main.c:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘pr_alg’
main.c:12: error: ‘pr_alg’ undeclared (first use in this function)
main.c:12: error: (Each undeclared identifier is reported only once
main.c:12: error: for each function it appears in.)
main.c:13: error: ‘FIFO’ undeclared (first use in this function)
invoc.c:7: error: expected ‘)’ before ‘myalg’
代码如下:
调用.h
:
#define INVOC_H
#ifndef INVOC_H
typedef enum {FIFO, SECOND_CHANCE, RANDOM, NRU, CLOCK, AGING} alg_t;
void func1(alg_t myalg);
#endif
调用.c
:
#include "invoc.h"
void func1(alg_t myalg) {
myalg = NRU;
}
main.c
:
#include "invoc.h"
int main(int argc, char **argv) {
extern alg_t pr_alg;
pr_alg = FIFO;
printf("PR_ALG: %d\n", pr_alg);
return 0;
}
有什么方法可以在 .h 文件中定义枚举,并将其包含在所有其他文件中,以便我可以创建该类型的不同变量并将其传递给函数?
最佳答案
您的
invoc.h
文件中有一个错误:#define INVOC_H #ifndef INVOC_H ... #endif
你先定义一个宏
INVOC_H
,然后检查它是否不存在(它确实存在),所以里面的代码被预处理器移除,不被编译器解析。
应该是:#ifndef INVOC_H #define INVOC_H ... #endif
此更改后您的代码将正常工作。
您不编译
.h
文件,只编译.c
文件。这就是为什么我们将所有定义放在.c
文件中,而只将声明放在.h
文件中。要编译,只需执行以下操作:gcc -std=c99 mmu.c invoc.c
您将
main()
中的pr_alg
声明为extern
变量。如果您提供的行是整个编译行,编译将发出链接器错误,因为变量pr_alg
未定义。在其中一个.c
文件中删除extern
或定义具有全局存储持续时间的变量pr_alg
。
关于c - 多个文件共享的 C 头文件中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271714/