C语言中重复定义的问题

几个基本知识:

1、头文件:头文件的作用在于编译时,会在#include<*.h>位置处展开,所以如果有多个.c文件include同一个头文件(很常见),如果头文件编写时不进行处理,出现重复定义是不可避免的。尤其是当一个项目分成多个模块的时候。

2、一般,把函数、变量、结构体、类等放在.c或者.cpp文件中,编译生成.o、.dll等给其他文件使用。

3、头文件一般放函数、变量、类的声明。

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


  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值