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

728

被折叠的 条评论
为什么被折叠?



