C lang: C语言中两个头文件引入相同的头文件(Header.h)

本文探讨了在C语言编程环境下,使用Clang编译器时,由于多个头文件包含相同宏定义和类型定义导致的重复定义错误。通过使用预编译指令`#pragma once`和`#ifndef/#define`机制,有效地避免了重复定义问题,确保了代码的正确编译。

C lang: C语言中两个头文件(Header.h)引入相同的头文件

For example:

Header.h:

#pragma once

#define ERROR -1

#define MaxVertexNum 100

#define INFINITY 65535

#define ESIZE sizeof(struct ENode)


typedef int Vertex;
typedef int WeightType;
typedef char DataType;

typedef int GraphType;	// 建立图类型(0: 无向图; 1: 有向图)

typedef int Bool;


typedef enum {

	False = 0,
	True

} Status;



typedef struct ENode {   /* 边定义 */
	
	/* 有向边 <V1, V2> */
	Vertex V1;
	Vertex V2;       

	WeightType Weight;    /* 权重 */

} ENode, * Epointer;

void visit(Vertex v);


LGHeader.h:

#pragma once

#include "Header.h"

#define LGSIZE sizeof(struct LGNode)
#define ASIZE sizeof(struct AdjVNode)


typedef struct AdjVNode {    /* 邻接点定义 */

	Vertex AdjV;    /* 邻接点下标 */
	WeightType Weight;    /* 对于网图边表,增加边权重Weight */
	struct AdjVNode* Next;   /* 指向下一个邻接点的指针 */

} AdjVNode, * Apointer;


typedef struct Vnode {    /* 顶点表头结点 */

	DataType Data;      /* 顶点无数据,Data可以不出现 */
	Apointer FirstEdge;   /* 边表头指针 */

} AdjList[MaxVertexNum];


typedef struct LGNode {   /* 图结点 */

	int Nv;    /* 顶点数 */
	int Ne;    /* 边数 */
	AdjList G;	// 邻接表

} LGNode, * LGpointer;

MGHeader.h:

#pragma once

#include "Header.h"


#define MGSIZE sizeof(struct MGraphNode)

typedef struct MGraphNode {   /* 图结点定义 */

	int Nv;   /* 顶点数: VertexNum */
	int Ne;   /* 边数:EdgeNum */
	WeightType G[MaxVertexNum][MaxVertexNum];    /* 邻接矩阵 */
	DataType Data[MaxVertexNum];    /* 存储顶点的数据;  若无顶点数据, 此时Data[]可以不定义 */

} GNode, * MGpointer;

main.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LGHeader.h"
#include "MGHeader.h"

#pragma warning(disable:4996)

int main() {
	
	printf("Hello world!");

	return 0;

}

Result:
报变量重复定义错误!
在这里插入图片描述
在公共引入的 Header.h 中使用 预编译指令

#pragma once

#ifndef HEADER_H
#define HEADER_H

#define ERROR -1

#define MaxVertexNum 100

#define INFINITY 65535

#define ESIZE sizeof(struct ENode)

typedef int Vertex;
typedef int WeightType;
typedef char DataType;

typedef int GraphType;	// 建立图类型(0: 无向图; 1: 有向图)

typedef int Bool;


typedef enum {

	False = 0,
	True

} Status;

typedef struct ENode {   /* 边定义 */
	
	/* 有向边 <V1, V2> */
	Vertex V1;
	Vertex V2;       

	WeightType Weight;    /* 权重 */

} ENode, * Epointer;

void visit(Vertex v);

#endif

一切正常!返回正确结果!
在这里插入图片描述

:
如果两个头文件互相引用, 则最好将其中的一个头文件拆分, 而后用另外2个头文件引用拆分出的公共头文件

References:

  1. https://www.cnblogs.com/RGBTH/p/13371357.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值