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

标签 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’

代码如下:

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

最佳答案

  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. 您将 main() 中的 pr_alg 声明为 extern 变量。如果您提供的行是整个编译行,编译将发出链接器错误,因为变量 pr_alg 未定义。在其中一个 .c 文件中删除 extern 或定义具有全局存储持续时间的变量 pr_alg

关于c - 多个文件共享的 C 头文件中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271714/

相关文章:

c++ - 在 QML 中使用 C++ 枚举作为字符串

vb.net - 在 VB.NET 中将字符串解析为 Enum 值

c++ - #include循环依赖错误

C++ 头文件 - 困惑!

c - 段错误,未分配内存

c - 我可以使用 gdb 的 x 命令打印内存,但是如果我使用 printf,则会出现段错误

c - 如何在C中将整数转换为字符串?

string - Swift 2.0 在字符串和枚举之间切换 :String

C 中的编译器错误 C2440

c - 在c中包含自定义头文件