关于自定义头文件在多个文件中引用时提示重复定义的问题(C语言)
我自己写了一个头文件,但在多个.c文件中引用它时就提示我重复定义,我也使用了条件编译的语句啊,请大家帮我看下是不是我写的程序有问题还是软件有问题。头文件如下:(主要是定义...
我自己写了一个头文件,但在多个.c文件中引用它时就提示我重复定义,我也使用了条件编译的语句啊,
请大家帮我看下是不是我写的程序有问题还是软件有问题。
头文件如下:(主要是定义一些全局变量)
文件名:identifier.h
内容:
#ifndef identifier_h
#define identifier_h
int a,b,c;
float d,e,f;
int m[5],n[5];
#endif
头文件的形式就是这样的,但是我在两个.c文件中引用它时就提示重复定义,.c文件如下:
文件名:sub1.c
内容:
#include "identifier.h"
void sub11()
{
if(a>b)
{
m[0]=a+d;
}
else
{
m[0]=b+d;
}
}
文件名:sub2.c
内容:
#include "identifier.h"
void sub22(int i)
{
if(d=m[i])
{
a=0;
}
else
{
b=0;
}
}
还有就是定义函数的文件是定义成.h文件好还是定义成.c文件好?
请大家指导一下!小弟我不胜感激。 展开
请大家帮我看下是不是我写的程序有问题还是软件有问题。
头文件如下:(主要是定义一些全局变量)
文件名:identifier.h
内容:
#ifndef identifier_h
#define identifier_h
int a,b,c;
float d,e,f;
int m[5],n[5];
#endif
头文件的形式就是这样的,但是我在两个.c文件中引用它时就提示重复定义,.c文件如下:
文件名:sub1.c
内容:
#include "identifier.h"
void sub11()
{
if(a>b)
{
m[0]=a+d;
}
else
{
m[0]=b+d;
}
}
文件名:sub2.c
内容:
#include "identifier.h"
void sub22(int i)
{
if(d=m[i])
{
a=0;
}
else
{
b=0;
}
}
还有就是定义函数的文件是定义成.h文件好还是定义成.c文件好?
请大家指导一下!小弟我不胜感激。 展开
1个回答
推荐于2017-09-29
展开全部
#ifndef identifier_h
#define identifier_h
....
#endif
这套条件编译是为了防止同一个.c文件中包含多个相同.h文件的(比如有一个.c文件包含了a.h,a.h又包含了b.h,那么当你在这个.c文件中同时包含了a.h和b.h时,因为有上面的条件编译的关系而不会出错)。因为编译器在编译的时候是按照.c文件为单位编译的,每个.c文件编译成.o文件(linux系统)或者.obj(windows系统),然后再将这些.o文件链接起来,最后与运行库链接形成可执行文件(elf或exe文件)。
你在两个.c文件中包含了同一个.h文件。这根本和条件编译没什么关系。你在.h文件中定义了全局变量a, b, c。那么就表示你两个.c文件中,每个.c文件中都有这样的全局变量定义:int a, b, c;当每个.c文件单独编译当然没有问题,但是当它们链接起来的时候就出现问题了:两个.c文件中都有变量a b c,所以当然是重复定义啊。问题是出在链接的时候的。
#define identifier_h
....
#endif
这套条件编译是为了防止同一个.c文件中包含多个相同.h文件的(比如有一个.c文件包含了a.h,a.h又包含了b.h,那么当你在这个.c文件中同时包含了a.h和b.h时,因为有上面的条件编译的关系而不会出错)。因为编译器在编译的时候是按照.c文件为单位编译的,每个.c文件编译成.o文件(linux系统)或者.obj(windows系统),然后再将这些.o文件链接起来,最后与运行库链接形成可执行文件(elf或exe文件)。
你在两个.c文件中包含了同一个.h文件。这根本和条件编译没什么关系。你在.h文件中定义了全局变量a, b, c。那么就表示你两个.c文件中,每个.c文件中都有这样的全局变量定义:int a, b, c;当每个.c文件单独编译当然没有问题,但是当它们链接起来的时候就出现问题了:两个.c文件中都有变量a b c,所以当然是重复定义啊。问题是出在链接的时候的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询