跨多个文件共享的C头文件中的枚举

时间:2018-07-10 18:12:35

标签: c enums header-files

我想定义一个枚举类型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文件中定义枚举,并将其包括在所有其他文件中,以便我可以创建该类型的不同变量并将其传递给函数?

1 个答案:

答案 0 :(得分:12)

  1. 您的invoc.h文件中有一个错误:

    #define INVOC_H
    #ifndef INVOC_H
    ...
    #endif
    

    您首先定义一个宏INVOC_H,然后检查它是否不存在(确实存在),以便内部代码被预处理器删除,而不由编译器解析。
    应该是:

    #ifndef INVOC_H
    #define INVOC_H
    ...
    #endif
    

    此更改后,您的代码将正常工作。

  2. 您不编译.h个文件,仅编译.c个文件。这就是为什么我们将所有定义都放在.c文件中,而只将声明放在.h文件中的原因。要编译,只需执行以下操作:

    gcc -std=c99 mmu.c invoc.c
    
  3. 您将pr_alg中的main()声明为extern变量。如果您提供的行是整个编译行,则编译器将发出链接器错误,因为未定义变量pr_alg。删除extern或在pr_alg文件之一中定义具有全局存储持续时间的变量.c