如何使用'c'语言中的extern关键字访问在其他文件中声明的结构

时间:2010-08-26 06:53:03

标签: c

我有3个文件。在一个文件中我声明了一个结构,在另一个文件中有main,我试图使用extern关键字访问该结构--------

//a.c---

include<stdio.h>
extern struct k  ;
extern int c;
int main()
{
  extern int a,b;
  fun1();
  fun2();
  c=10;
  printf("%d\n",c);
  struct k j;
  j.id=89;
  j.m=43;
  printf("\n%d\t%f",j.id,j.m);
}


//1.c

#include<stdio.h>
struct k
{
  int id;
  float m;
}j;

int c;
void fun1()
{
  int a=0,b=5;
  printf("tis is fun1");
  printf("\n%d%d\n",a,b);
}


//2.c--

#include<stdio.h>
struct k
{
  int id;
  float m;
}j;

void fun2()
{
  int a=10,b=4;
  printf("this is fun2()");
  printf("\n%d%d\n",a,b);
}

我使用cc a.c 1.c 2.c编译了此代码 但我收到的错误为storage size of ‘j’ isn’t known

5 个答案:

答案 0 :(得分:2)

//a.h---

#include<stdio.h>
#include "1.h"//cannot know its there without including it first.
#include "2.h"
extern struct k;// don't really need to do this and is wrong. 
extern int c;

//a.c
int main()
{
  extern int a,b;//externs i believe should be in the h file?
  fun1();
  fun2();
  c=10;
  printf("%d\n",c);
  struct k *ptr = malloc(sizeof(struct k));//Define our pointer to the struct and make use of malloc.
  //now we can point to the struct, update it and even retrieve.
  ptr->id = 89;
  ptr->m = 43;
  printf("\n%d\t%f" ptr->id,ptr->m);
}


//1.h

#include<stdio.h>
typeof struct k
{
  int id;
  float m;
}j;

//1.c
int c;
void fun1()
{
  int a=0,b=5;
  printf("tis is fun1");
  printf("\n%d%d\n",a,b);
}


//2.h--

#include<stdio.h>
struct k
{
  int id;
  float m;
}j;

//2.c
void fun2()
{
  int a=10,b=4;
  printf("this is fun2()");
  printf("\n%d%d\n",a,b);
}

我已经在地方编辑了代码,所以它应该看到结构并指向它。每个C文件应该知道有一个头文件h。当属于你的main的a.h包含文件时,它不仅可以看到它们,而且应该能够访问它们。这意味着如果我没记错的话,它也应该知道K是J的别名是什么。

我应该知道更新结构并通过指针从中检索数据。如果这仍然无法正常工作,请发布您的编译错误并复制并粘贴它所哭泣的行。

答案 1 :(得分:0)

struct k中没有a.c可见的定义。将定义放在头文件中,并将其包含在所有三个源文件中。

答案 2 :(得分:0)

struct k如何构建对象的说明。它不是一个对象。 extern对对象进行操作。

通常struct块放在标题或.h文件中。

jk类型的对象。应在extern1.c中声明2.c

在使用之前,应声明多个文件(如变量)之间使用的函数。

把它们放在一起,你可能想要

//a.c---

#include <stdio.h>
#include "k.h" /* contains definition of struct k */

extern int c;
extern k j;

extern void fun1();
extern void fun2();

int main()
{
  extern int a,b;
  fun1();
  fun2();
  c=10;
  printf("%d\n",c);

  j.id=89;
  j.m=43;
  printf("\n%d\t%f",j.id,j.m);
}

答案 3 :(得分:0)

你的一些概念是错误的。请查看此link

要将变量作为extern访问,您必须首先定义它,在您的情况下您没有这样做。

答案 4 :(得分:-1)

extern修饰符会更改您声明或定义的变量的链接。在C中,只有变量名称可以具有链接 - 而不是类型,例如struct k

如果要访问struct类型的内部,则必须在同一源文件中完全定义它。对源文件之间共享的类型执行此操作的常用方法是将struct的定义放入头文件中,该文件随#include一起包含在每个源文件中。