C语言中重复定义的问题
来源:互联网 发布:软件视频会议系统 编辑:程序博客网 时间:2024/06/06 09:05
几个基本知识:
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
- C语言中重复定义的问题
- C语言中全局变量的定义及重复包含问题
- C/C++中重复定义的问题
- C语言中union的定义问题
- C语言中如何解决重复include的问题
- 【疑问】c语言中变量的集中定义问题
- c语言中字符串常量定义时的换行问题
- gcc C语言中变量定义的位置问题
- apue中重复定义的问题
- 对于单片机中重复定义的问题
- C语言中矩阵定义问题
- 重复定义的问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 韩语学习之第二课
- 误删数据文件后,Outlook无法启动的处理办法
- hdu-1162-Eddy's picture
- POJ 2456 Aggressive cows
- 关于定位、浮动、z-index 和 offsetParent 的一些概念
- C语言中重复定义的问题
- 一款集阅读、听书以及搜书于一体的多功能阅读器
- JSP表单提交给Servlet处理后,转到重定向的页面时,布局混乱
- Android-Spinner的Listenner事件及菜单级联
- GCDAsyncSocket接收数据连包无法解析的问题
- NSFileManager和NSFileHandle
- cocos2d-x 3.0 回调事件
- BeagleBone的GPIO控制
- 整除的尾数 【杭电-2099】 附题