头文件重复定义问题

chen19901204 2012-08-20 04:52:04
头文件 head.h 的定义如下,已经用#ifndef #define #endif 来防止冲文件被重复定义了但是编译的时候还是提示
int count=0; /* 学生数量的计数器; */
char subject[SUMJECT_NUM][20];// 学科名
被重复定义 该怎么解决这个问题,有什么问题请指出 谢谢



#ifndef _HEAD_H
#define _HEAD_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SUMJECT_NUM 3
#define MAX_SRUDENT 100

struct student// 学生属性
{
char std_num[10];
char name[20];
float sco[SUMJECT_NUM];
float avg;
};
int count=0; /* 学生数量的计数器; */
char subject[SUMJECT_NUM][20];// 学科名

typedef struct student * poit_List ;

void swap(poit_List *a,poit_List *b);

void mutu(void);

void F_input(poit_List *List);

void file_out(poit_List *List);

void out(poit_List *List);

poit_List * cread_student(poit_List *List);

void check_studend(poit_List *List);

void Modify(poit_List *List);

void Delete(poit_List *List);

void sort(poit_List *List);

void Add(poit_List *List);

void sub(poit_List *List);

#endif
...全文
3726 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_16999443 2014-07-26
  • 打赏
  • 举报
回复
我一直从楼上看到楼下,努力去了解大神的世界。**,神,咋么那么难!
jsvisa 2012-10-25
  • 打赏
  • 举报
回复 1
#ifndef #define #endif是防止在一个.c文件中重复编译的,例如如果在一个file1.c中包含了两次头文件,使用了宏定义那么实际上只包含了一次。但是如果在多个.c文件中包含了同一个.h头文件,编译是没有问题的(即使没有宏定义),但在这里如果在.h文件中定义了一个变量,编译器就会报错,重复定义。如果要在头文件中定义一个变量,那么将变量的作用域限定为本文件,即使用static限制,那么.c文件包含的时候实际上得到的只是原来值的一份拷贝而已。
jsvisa 2012-10-25
  • 打赏
  • 举报
回复
#ifndef #define #endif是防止在一个.c文件中重复编译的,例如如果在一个file1.c中包含了两次头文件,使用了宏定义那么实际上只包含了一次。但是如果在多个.c文件中包含了同一个.h头文件,编译是没有问题的(即使没有宏定义),但在这里如果在.h文件中定义了一个变量,编译器就会报错,重复定义。如果要在头文件中定义一个变量,那么将变量的作用域限定为本文件,即使用static限制,那么.c文件包含的时候实际上得到的只是原来值的一份拷贝而已。
契约无罪 2012-09-11
  • 打赏
  • 举报
回复
你add函数的定义有没有又定义一个重名的count的临时变量
契约无罪 2012-09-11
  • 打赏
  • 举报
回复
你add函数里面是不是又重新定义了一个局部变量count和这个全局变量冲突了
wangyongtao1123 2012-09-01
  • 打赏
  • 举报
回复
在.h里声明定义int count=0;
在用到 count 的.c里写上extern count;就可以了
gongliaoan 2012-08-30
  • 打赏
  • 举报
回复
在VC中编译没有问题。
DISHIKUN2008 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 的回复:]

#ifndef #define你还不够仔细了解。在头文件中用这个宏确实是防止头文件被包含,你说得没有问题,但是,你不了解的是,这个“防止重复包含”是对一个.c源文件而言的,不是对整个项目的所有.c来说的,也就是说如果你在a.c中包含两次.h的话,是可以防止重复被包含的,如果你在a.c和b.c中都包含一次.h这是没有问题的,而问题就出在这里,你头文件中定义了一个变量,你的头文件一定是被多个.c文件……
[/Quote]

你好,还是有点不明白#ifndef #define作用,

cat test.h

#ifndef _TSET_H_
#define _TEST_H_
int value = 4;

#endif



test.c

#include<stdio.h>
#include "test.h"
#include "test.h"

int main()
{
printf("value is %d\n",value);

return 0;
}


执行:gcc -o test test.c

结果报错:

In file included from test.c:3:0:
test.h:3:5: error: redefinition of 'value'
test.h:3:5: note: previous definition of 'value' was here


yujie_v 2012-08-29
  • 打赏
  • 举报
回复
好复杂的重复定义错误。。。
zjwdmlmx 2012-08-29
  • 打赏
  • 举报
回复

extern int a; //没有非配内存 是声明
extern int a = 0; //非配了内存
extern char dir[MAX_SIZE]; // 非配了内存
extern char *dir[MAX_SIZE]; // 非配了内存
extern char **dir; //是声明 没有非配 内存
ryujiyamaziki 2012-08-27
  • 打赏
  • 举报
回复
头文件里不能定义全局变量,如果定义了得话,就会犯multi definition的错误,gcc下自己曾经犯过这样的错误。
yby4769250 2012-08-26
  • 打赏
  • 举报
回复
#ifndef #define你还不够仔细了解。在头文件中用这个宏确实是防止头文件被包含,你说得没有问题,但是,你不了解的是,这个“防止重复包含”是对一个.c源文件而言的,不是对整个项目的所有.c来说的,也就是说如果你在a.c中包含两次.h的话,是可以防止重复被包含的,如果你在a.c和b.c中都包含一次.h这是没有问题的,而问题就出在这里,你头文件中定义了一个变量,你的头文件一定是被多个.c文件包含了,在a.c和b.c中预编译阶段头文件被替换后,count变量在每个.c中都有一份定义,就存在重定义问题了
hwdh1987 2012-08-24
  • 打赏
  • 举报
回复
头文件的作用,是将变量和函数的声明集中起来统一管理。而其中的宏定义的东西是预处理时被原样替换的。在你的头文件中有 诸如 int count = 0;的语句,它的效果是定义变量,不是声明变量。因此造成的结果会是 int count = 0; int count = 0;那么你认为在.c文件中可以如此吗?另外,变量定义是要分配内存的。我们应该尽可能的明白原理,而不是不明其理。
xhy972171831 2012-08-24
  • 打赏
  • 举报
回复
不会是有些头文件没加#ifndef #define #endif吧···
tony_dwr 2012-08-24
  • 打赏
  • 举报
回复
你有两个.c文件include了这个.h文件吧?
这样的话a.c里面也有int count=0;
b.c里也有int count =0; 当然重定义了。
.h文件里面不要定义变量和函数,只声明变量 函数的话只内联函数.

最好不要用全局变量!!
xcf007 2012-08-23
  • 打赏
  • 举报
回复
头文件只放声明部分(变量声明,函数的签名等)
还有楼主查查extern拓展文件作用域什么的内容。(这个好像对变量,函数好像相当于都是extern的,对应有个static这个别联想那个静态变量的那个static,具体不清楚,毕竟不是搞c/c++开发,都是以前残留的那点记忆)。

头文件无非就是告诉编译器你不认识的那些标记符在别的文件里面,你给我崩报找不到的错误,顺利编译。
尽量把头文件和源文件分离好,头文件起到对外公开的接口作用。

oSoulEater 2012-08-22
  • 打赏
  • 举报
回复
头文件中不能出现变量的定义;只能是声明
mzoge1990 2012-08-22
  • 打赏
  • 举报
回复
声明成静态变量,加上 static 。
xyq857086792 2012-08-22
  • 打赏
  • 举报
回复
#define SUMJECT_NUM 3

还有个问题啊 。你在.c文件里面定义的宏 ,,怎么可以拿到.h来用。。。?
hslinux 2012-08-21
  • 打赏
  • 举报
回复

A.h文件包含了 head.h ,那么A.c生成.o文件时,会有一份subject变量;
B.h文件也包含了head.h,那么B.c生成.o文件时,也会有一份subject变量;

对于A.o,B.o来说,都是对立的,不相关联的,但是对于整个项目来说,就有了两份subject变量;

所以就需要把subject变量放到head.c文件中去,这样A.o,B.o中就不会有subject变量;一份subject变量仅存在于head.o文件中。

整个工程链接的时候,把所有.o文件都链接在一起,A,B中也就可以访问到subject变量。

加载更多回复(38)

69,373

社区成员

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

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