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

Tho*_*s M 2 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’
Run Code Online (Sandbox Code Playgroud)

代码如下:

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
Run Code Online (Sandbox Code Playgroud)

invoc.c:

#include "invoc.h"

void func1(alg_t myalg) {
    myalg = NRU;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以在.h文件中定义枚举,并将其包含在所有其他文件中,以便我可以创建该类型的不同变量并将其传递给函数?

Kam*_*Cuk 12

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

    #define INVOC_H
    #ifndef INVOC_H
    ...
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

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

    #ifndef INVOC_H
    #define INVOC_H
    ...
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 你不编译.h文件,只编译.c文件.这就是为什么我们将所有定义放在.c文件中,只在.h文件中声明.要编译,只需执行:

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