我们可以在头文件中使用带有 typedef 数据类型的 extern 关键字吗?

Can we use extern keyword with typedef datatype in header file?

我想在c 中使用静态库实现堆栈及其功能。但是,即使在使用 extern 在头文件中声明了 STACK 之后,我仍然收到错误,STACK 不是 declared.I 已经在单独的 stack_1.c 文件中声明了堆栈,并希望其他函数(如 push、pop 等)访问此 stack.Is 可以这样做吗?

.I have declared stack in a separate stack_1.c file and want other functions like push, pop etc to access this stack.

不,您必须在 stack_main.cpush.c.

中包含的头文件中添加类型 STACK 的定义

最简单的选择是将类型 STACK 的定义移动到头文件 lib.h

你还可以在stack_1.c中定义结构,在头文件中定义typedef。这可以向外部世界隐藏 STACK 的内部运作。但是在你的情况下,我会采用第一种方法。

例如在 stack_1.c 中(或者最好在另一个头文件中)

struct stack1{

    int stk[MAX] ;
    int top;  
};

并在 lib.h

typedef struct stack1 STACK;

当你有外部声明时,编译器不知道 STACK 是什么。而且你不能使用 extern 类型别名。

但是你可以按照标准 C 库对 FILE 结构的处理方式解决它:

typedef struct stack_struct STACK;

只要您的库的用户只使用指向 STACK(即 STACK *)的指针,那么他们就不需要结构定义本身。这使得堆栈成为 opaque data type.

然后在您的实施中您只需

struct stack_struct
{
    // Your structure...
};

在您包含在您的实现源文件中的私有头文件中。将结构定义放在头文件中很重要,将结构定义在源文件中使其仅可用于该单个源文件。

您收到该错误是因为编译器在编译 stack_main.c

时无法理解什么是 "STACK"

"extern"关键字不是针对类型而是针对变量。即,如果您在 .c 文件中定义了全局变量并想在另一个 .c 文件中使用,那么您必须告诉第二个 .c 文件已经在另一个 .c 文件中定义了一个变量,并且只需使用该变量即可"extern" 关键字。

因此,要修复错误,您需要在 .h 文件中定义 STACK 类型,并将该 .h 文件包含在两个 .c 文件中。