我们可以在头文件中使用带有 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 可以这样做吗?
列表项
里面stack_main.c
#define MAX 5
#include "lib.h"
void push(int, STACK *);
int pop(STACK *);
void display(STACK *);
int main()
{
int flag,ele,show;
STACK s;
s.top=-1;
while(1)
{
printf("Enter 1:push 2:pop 3:display 4:exit\n");
scanf("%d",&flag);
switch(flag)
{
case 1:
printf("Enter ele\n");
scanf("%d",&ele);
push(ele,&s);
break;
里面lib.h
extern STACK;
int main();
void push(int , STACK *);
int pop(STACK *);
void display(STACK *);
里面push.c
#include "lib.h"
void push(int ele, STACK* a)
{
if(a->top!= MAX-1)
{
a->top++;
a->stk[a->top]=ele;
}
}
里面stack_1.c
#define MAX 5
#include "lib.h"
typedef struct {
int stk[MAX] ;
int top;
}STACK;
错误:
ani@ani-VirtualBox:~/Documents/ostl/week4$ gcc -c stack_main.c stack_1.c push.c pop.c display.c
In file included from stack_main.c:4:0:
lib.h:1:8: warning: type defaults to ‘int’ in declaration of ‘STACK’ [-Wimplicit-int]
extern STACK;
^~~~~
lib.h:3:17: error: expected declaration specifiers or ‘...’ before ‘STACK’
void push(int , STACK *);
^~~~~
lib.h:4:9: error: expected declaration specifiers or ‘...’ before ‘STACK’
int pop(STACK *);
^~~~~
lib.h:5:14: error: expected declaration specifiers or ‘...’ before ‘STACK’
void display(STACK *);
^~~~~
stack_main.c:8:16: error: expected declaration specifiers or ‘...’ before ‘STACK’
void push(int, STACK *);
^~~~~
stack_main.c:9:9: error: expected declaration specifiers or ‘...’ before ‘STACK’
int pop(STACK *);
^~~~~
stack_main.c:10:14: error: expected declaration specifiers or ‘...’ before ‘STACK’
void display(STACK *);
^~~~~
stack_main.c: In function ‘main’:
stack_main.c:16:11: error: expected ‘;’ before ‘s’
STACK s;
^
stack_main.c:17:5: error: ‘s’ undeclared (first use in this function)
s.top=-1;
.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.c
和 push.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 文件中。
我想在c 中使用静态库实现堆栈及其功能。但是,即使在使用 extern 在头文件中声明了 STACK 之后,我仍然收到错误,STACK 不是 declared.I 已经在单独的 stack_1.c 文件中声明了堆栈,并希望其他函数(如 push、pop 等)访问此 stack.Is 可以这样做吗?
列表项
里面stack_main.c
#define MAX 5 #include "lib.h" void push(int, STACK *); int pop(STACK *); void display(STACK *); int main() { int flag,ele,show; STACK s; s.top=-1; while(1) { printf("Enter 1:push 2:pop 3:display 4:exit\n"); scanf("%d",&flag); switch(flag) { case 1: printf("Enter ele\n"); scanf("%d",&ele); push(ele,&s); break;
里面lib.h
extern STACK; int main(); void push(int , STACK *); int pop(STACK *); void display(STACK *);
里面push.c
#include "lib.h" void push(int ele, STACK* a) { if(a->top!= MAX-1) { a->top++; a->stk[a->top]=ele; } }
里面stack_1.c
#define MAX 5 #include "lib.h" typedef struct { int stk[MAX] ; int top; }STACK;
错误:
ani@ani-VirtualBox:~/Documents/ostl/week4$ gcc -c stack_main.c stack_1.c push.c pop.c display.c In file included from stack_main.c:4:0: lib.h:1:8: warning: type defaults to ‘int’ in declaration of ‘STACK’ [-Wimplicit-int] extern STACK; ^~~~~ lib.h:3:17: error: expected declaration specifiers or ‘...’ before ‘STACK’ void push(int , STACK *); ^~~~~ lib.h:4:9: error: expected declaration specifiers or ‘...’ before ‘STACK’ int pop(STACK *); ^~~~~ lib.h:5:14: error: expected declaration specifiers or ‘...’ before ‘STACK’ void display(STACK *); ^~~~~ stack_main.c:8:16: error: expected declaration specifiers or ‘...’ before ‘STACK’ void push(int, STACK *); ^~~~~ stack_main.c:9:9: error: expected declaration specifiers or ‘...’ before ‘STACK’ int pop(STACK *); ^~~~~ stack_main.c:10:14: error: expected declaration specifiers or ‘...’ before ‘STACK’ void display(STACK *); ^~~~~ stack_main.c: In function ‘main’: stack_main.c:16:11: error: expected ‘;’ before ‘s’ STACK s; ^ stack_main.c:17:5: error: ‘s’ undeclared (first use in this function) s.top=-1;
.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.c
和 push.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 文件中。