我有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
答案 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
文件中。
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);
}
答案 3 :(得分:0)
你的一些概念是错误的。请查看此link。
要将变量作为extern访问,您必须首先定义它,在您的情况下您没有这样做。
答案 4 :(得分:-1)
extern
修饰符会更改您声明或定义的变量的链接。在C中,只有变量名称可以具有链接 - 而不是类型,例如struct k
。
如果要访问struct
类型的内部,则必须在同一源文件中完全定义它。对源文件之间共享的类型执行此操作的常用方法是将struct
的定义放入头文件中,该文件随#include
一起包含在每个源文件中。