C语⾔中重复定义的问题
⼏个基本知识:
1、头⽂件:头⽂件的作⽤在于编译时,会在#include<*.h>位置处展开,所以如果有多个.c⽂件include同⼀个头⽂件(很常见),如果头⽂件编写时不进⾏处理,出现重复定义是不可避免的。尤其是当⼀个项⽬分成多个模块的时候。
2、⼀般,把函数、变量、结构体、类等放在.c或者.cpp⽂件中,编译⽣成.o、.dll等给其他⽂件使⽤。
3、头⽂件⼀般放函数、变量、类的声明。
c语言struct头文件4、不允许被其他⽂件使⽤的函数⽤static定义,否则默认为extern
5、⼀般不要在头⽂件中定义变量、函数、类,否则容易产⽣重复定义。
6、要使⽤其他模块(⽂件)定义的函数、变量等,直接包含其头⽂件。
例
//a.c
#include<stdio.h>
void Print(void){
printf("test\n");
}
//a.h
void Print(void); //声明Print函数
//b.c
#include<a.h>
main(){
Print();
}
编译后运⾏,打印出test
我们经常遇到这样⼀种情况,需要定义⼀个结构体,这个结构体可能要在多个⽂件中使⽤。⼀般我们把结构体定义在头⽂件中,其他⽂件要使⽤时,只需要
include就可以了,不幸的是,编译的时候会出现重复定义的提⽰。原因很简单,多次include展开时,头⽂件中定义的结构体会被多次定义。例如:在f1.c中有#include<a.h>,f2.c中也有#include<a.h>,那么a.h就会展开两次,结构体就重复定义了,这时候就需要对头⽂件进⾏处理了。
例:
1、在 struct.h中定义了⼀个结构体sqlist
//struct.h
#ifndef STRU_H //这个STRU_H是随意取的,但是最好是有意义并且不与其他重复
#define STRU_H
typedef struct{
int length;
int listsize;
}Sqlist;
#endif
2、在⽂件f1.c中定义了⼀个函数Initlist对结构体进⾏初始化操作
//f1.c
#include<struct.h>
#include<stdio.h>
void Initlist(Sqlist *L){
L->length=0;
L->listsize=100;
}
3、在头⽂件f1.h中对函数进⾏声明
//f1.h
#ifndef FUN1_H
#define FUN1_H
void Initlist(Sqlist *L);
#endif
4、在⽂件f2.c中有main函数定义了⼀个结构体类型变量,并调⽤外部函数Initlist进⾏初始化//f2.c
#include<stdio.h>
#include<struct.h> //为了使⽤结构体类型
#include<f1.h> //为了调⽤外部函数
void main(){
Sqlist La;
Initlist(&La);
printf("%d,%d\n",La.length,La.listsize);
}
5、正确编译,运⾏,得到结果 0,100
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论