Как получить доступ к структуре, объявленной в другом файле, используя ключевое слово extern на языке 'c' - PullRequest
0 голосов
/ 26 августа 2010

У меня 3 файла.В одном файле я объявил структуру, а в другом файле, который имеет основной, я пытаюсь получить доступ к этой структуре, используя ключевое слово 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 ]

2 голосов
/ 06 сентября 2015
//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 файла.Когда ах, принадлежащий вашему основному файлу, включает в себя файлы, он не только может их видеть, но и должен иметь к ним доступ.Это означает, что он также должен знать, что K является J, псевдоним K, если я правильно помню.

Я должен знать, обновить структуру и получить данные из нее через указатель.Если это все еще не работает, пожалуйста, опубликуйте свою ошибку компиляции и скопируйте и вставьте строку, по которой она плачет.

0 голосов
/ 27 августа 2010

Модификатор extern изменяет связь переменной, которую вы объявляете или определяете.В C только имена переменных могут иметь связь, но не типы, например struct k.

. Если вы хотите получить доступ к внутренним компонентам типа struct, они должны быть полностью определены в том же исходном файле.Обычный способ сделать это для типов, которые совместно используются исходными файлами, состоит в том, чтобы поместить определение struct в заголовочный файл, который включен с #include в каждый исходный файл.

0 голосов
/ 26 августа 2010

struct k - это описание , как построить объект. Это не объект. extern действует на объекты.

Обычно struct блоки помещаются в заголовок или .h файл.

j является объектом типа k. Он должен быть объявлен extern в 1.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);
}
0 голосов
/ 26 августа 2010

Некоторые ваши понятия неверны.Пожалуйста, отметьте эту ссылку .

Чтобы получить доступ к переменной как extern, вы должны сначала определить ее, что вы не сделали в вашем случае.

0 голосов
/ 26 августа 2010

У вас нет определения для struct k, видимого из a.c. Поместите определение в заголовочный файл и включите его из всех трех исходных файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...