【问题标题】:Can we use extern keyword with typedef datatype in header file?我们可以在头文件中使用带有 typedef 数据类型的 extern 关键字吗?
【发布时间】:2019-12-25 07:43:46
【问题描述】:

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

  • 列表项

    在 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 在 stack_main.c:4:0 包含的文件中: lib.h:1:8:警告:在声明“STACK”[-Wimplicit-int] 时,类型默认为“int” 外部堆栈; ^~~~~ lib.h:3:17:错误:预期的声明说明符或“...”在“堆栈”之前 无效推(int,堆栈*); ^~~~~ lib.h:4:9:错误:预期的声明说明符或“...”在“堆栈”之前 诠释弹出(堆栈*); ^~~~~ lib.h:5:14:错误:预期的声明说明符或“...”在“堆栈”之前 无效显示(堆栈*); ^~~~~ stack_main.c:8:16:错误:预期的声明说明符或“...”在“堆栈”之前 无效推(int,堆栈*); ^~~~~ stack_main.c:9:9:错误:预期的声明说明符或“...”在“堆栈”之前 诠释弹出(堆栈*); ^~~~~ stack_main.c:10:14:错误:预期的声明说明符或“...”在“堆栈”之前 无效显示(堆栈*); ^~~~~ stack_main.c:在函数'main'中: stack_main.c:16:11: 错误:预期的‘;’在‘s’之前 堆栈; ^ stack_main.c:17:5: error: ‘s’ undeclared (第一次在这个函数中使用) s.top=-1;

【问题讨论】:

    标签: c stack static-libraries typedef extern


    【解决方案1】:

    .我在一个单独的 stack_1.c 文件中声明了堆栈,并希望其他函数(如 push、pop 等)访问此堆栈。

    不,您必须在包含在stack_main.c 和push.c 中的头文件中添加STACK 类型的定义。

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

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

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

    struct stack1{
    
        int stk[MAX] ;
        int top;  
    };
    

    在 lib.h 中

    typedef struct stack1 STACK;
    

    【讨论】:

      【解决方案2】:

      当您有外部声明时,编译器不知道STACK 是什么。而且无论如何你都不能使用extern type-aliases。

      但您可以像标准 C 库对 FILE 结构所做的那样解决它:

      typedef struct stack_struct STACK;
      

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

      那么在你的实现中你只需要

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

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

      【讨论】:

        【解决方案3】:

        您收到该错误是因为编译器在编译 stack_main.c 时无法理解“STACK”是什么

        “extern”关键字不是针对类型而是针对变量的。即,如果您在 .c 文件中定义了全局变量并希望在另一个 .c 文件中使用,那么您必须告诉第二个 .c 文件在另一个 .c 文件中已经定义了一个变量,然后使用该变量使用“外部”关键字。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-09
          • 1970-01-01
          • 2012-03-18
          • 2023-03-28
          • 2019-07-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多