我想定义一个枚举类型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’
代码如下:
invoc.h
:
#define INVOC_H
#ifndef INVOC_H
typedef enum {FIFO, SECOND_CHANCE, RANDOM, NRU, CLOCK, AGING} alg_t;
void func1(alg_t myalg);
#endif
invoc.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文件中定义枚举,并将其包括在所有其他文件中,以便我可以创建该类型的不同变量并将其传递给函数?
答案 0 :(得分:12)
您的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
您将pr_alg
中的main()
声明为extern
变量。如果您提供的行是整个编译行,则编译器将发出链接器错误,因为未定义变量pr_alg
。删除extern
或在pr_alg
文件之一中定义具有全局存储持续时间的变量.c
。