c语言用extern 引用结构的问题,本人新手望解答

songe88 2015-08-30 09:10:13
两个文件共同编译,文件1内容如下
struct date {
char month[15];
char abbreviation[4];
int days;
int month_num;
};
struct date years[12] =
{
{"January","Jan",31,1},
{"February","Feb",28,2},
{"March","Mar",31,3},
{"April","Apr",30,4},
{"May","May",31,5},
{"June","Jun",30,6},
{"July","Jul",31,7},
{"August","Aug",31,8},
{"September","Sep",30,9},
{"October","Oct",31,10},
{"November","Nov",30,11},
{"December","Dec",31,12}
};


文件2内容如下:
#include <stdio.h>
extern struct date years[];
int main(void)
{
int i;
puts("Enter month you want\"1-12\"(non digital to quit)");
while (scanf("%d", &i) == 1)
{
int k = 0;
while (getchar() != '\n')
continue;
for (int m = 0; m < i; m++)
k += years[m].days;
printf("%d days\n", k);
puts("Enter month you want\"1-12\"(non digital to quit)");
}
return 0;
}

编译时显示:“days”的左侧部分指定未定义的结构/联合“date”
就是引用结构不成功呗,可是为什么不成功呢?求解答
...全文
525 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
晒太阳的猪猪 2017-12-06
  • 打赏
  • 举报
回复
可以不用头文件,但这样在你引用的文件内必须重新声明你extern变量的结构
songe88 2015-08-30
  • 打赏
  • 举报
回复
谢谢各位,分已给,继续看书
freepenix 2015-08-30
  • 打赏
  • 举报
回复
引用 6 楼 u014513151 的回复:
[quote=引用 4 楼 songe88 的回复:] 就是说我必须要用头文件把这两个文件联系起来是么,不用.h文件不可以么
用一个头文件是最好的,C++中的话可以用 #ifndef _HEADERNAME_H #define _HEADERNAME_H ...//(头文件内容) #endif 这个东西防止重复定义,但是最好还是避免隐患[/quote] 额,少打字了,是C/C++可以用这个防止重复定义,C和C++都可以,,,
freepenix 2015-08-30
  • 打赏
  • 举报
回复
引用 4 楼 songe88 的回复:
就是说我必须要用头文件把这两个文件联系起来是么,不用.h文件不可以么
用一个头文件是最好的,C++中的话可以用 #ifndef _HEADERNAME_H #define _HEADERNAME_H ...//(头文件内容) #endif 这个东西防止重复定义,但是最好还是避免隐患
二班的码农 2015-08-30
  • 打赏
  • 举报
回复
引用 4 楼 songe88 的回复:
就是说我必须要用头文件把这两个文件联系起来是么,不用.h文件不可以么
用两个源文件,这样在编译时,两个源文件都会编译一次,就会造成全局变量的重复定义
songe88 2015-08-30
  • 打赏
  • 举报
回复
就是说我必须要用头文件把这两个文件联系起来是么,不用.h文件不可以么
二班的码农 2015-08-30
  • 打赏
  • 举报
回复
extern 表示声明一个全局变量,并不是定义一个全局变量 当涉及多个文件使用同一个全局变量时,一般在某个头文件中extern声明一个全局变量,在其中某个源文件(包含了那个头文件)中定义这个全局变量,其它源文件,只要引用那个头文件,就可以使用这个全局变量了 以上程序,years数组只应用于一个源文件中,不需要加extern,直接把声明放在头文件中,把定义放在源文件中。而且楼主,你第二个文件没有包含第一个文件,struct date会无法识别吧
freepenix 2015-08-30
  • 打赏
  • 举报
回复
头文件:
#include <stdio.h>
#include <stdlib.h>


struct date {
char month[15];
char abbreviation[4];
int days;
int month_num;
};

extern struct date years[12];
A.cpp:
#include "head.h"

struct date years[12] =
{
{"January","Jan",31,1},
{"February","Feb",28,2},
{"March","Mar",31,3},
{"April","Apr",30,4},
{"May","May",31,5},
{"June","Jun",30,6},
{"July","Jul",31,7},
{"August","Aug",31,8},
{"September","Sep",30,9},
{"October","Oct",31,10},
{"November","Nov",30,11},
{"December","Dec",31,12}
};
B.cpp:
#include "head.h"

int main(void)
{
	int i;
	puts("Enter month you want\"1-12\"(non digital to quit)");
	while (scanf("%d", &i) == 1)
	{
		int k = 0;
		while (getchar() != '\n')
			continue;
		
		for (int m = 0; m < i; m++)
			k += years[m].days;
		
		printf("%d days\n", k);
		puts("Enter month you want\"1-12\"(non digital to quit)");
	}

	system("pause");
	return 0;
}
extern用法是正确的,不能有重复定义,你没有弄错,但是,文件2并不知道文件1的结构,所以,他知道years是结构数组,但他并不知道这个结构是什么样子的
二班的码农 2015-08-30
  • 打赏
  • 举报
回复
extern 表示声明一个全局变量,并不是定义一个全局变量 当涉及多个文件使用同一个全局变量时,一般在某个头文件中extern声明一个全局变量,在其中某个源文件(包含了那个头文件)中定义这个全局变量,其它源文件,只要引用那个头文件,就可以使用这个全局变量了 以上程序,years数组只应用于一个源文件中,不需要加extern,直接把声明放在头文件中,把定义放在源文件中。而且楼主,你第二个文件没有包含第一个文件,struct date会无法识别吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧