gpt4 book ai didi

c - 将同一文件包含在 2 个文件中然后将它们包含在另一个文件中时出错(在 c 中)

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:15 25 4
gpt4 key购买 nike

我有一个 C 语言的问题,我不知道如何解决。假设我有 4 个 c 文件,a.c;公元前;抄送;直流电,对于它们中的每一个,都有一个 .h 文件:a.h; b.h; c.h; d.h,它们当然包括在内。我想执行以下操作:

a.h 将包含:

#include "b.h"
#include "c.h"
...

b.h 将包含:

#include "d.h"
...

并且 c.h 还将包含:

#include "d.h"
...

在d.h中我定义了一个struct,比如d.h的内容会是:

typedef struct address { 
int address;
} address;

问题是我得到错误(当我编译文件时):

In file included from c.h:1:0,
from a.h:2,
from a.c:1:
d.h:3:16: error: redefinition of ‘struct address’
d.h:3:16: note: originally defined here
d.h:5:3: error: conflicting types for ‘address’
d.h:5:3: note: previous declaration of ‘address’ was here

我明白为什么会这样(因为预处理器两次导入定义),但我该如何解决呢?我需要 include 就是这样(因为我当然有更多文件,这只是一个例子)。我能做什么?

注意:我的 makefile 是:

project: a.o b.o c.o d.o
gcc -g a.o b.o c.o d.o -ansi -Wall -pedantic -o output

a.o: a.c a.h b.c b.h c.c c.h d.c d.h
gcc -c a.c -ansi -Wall -pedantic -o a.o

b.o: b.c b.h d.c d.h
gcc -c b.c -ansi -Wall -pedantic -o b.o

c.o: c.c c.h d.c d.h
gcc -c c.c -ansi -Wall -pedantic -o c.o

d.o: d.c d.h
gcc -c d.c -ansi -Wall -pedantic -o d.o

而且我认为没关系.. 它对我有用。感谢您的帮助。

最佳答案

在预处理器保护中包含每个头文件的内容:

/* a.h */
#ifndef A_H_
#define A_H_

/* content of a.h goes here */

#endif

其他标题相同:

/* b.h */
#ifndef B_H_
#define B_H_

/* content of b.h goes here */

#endif

等等。

这是确保每个标题内容只被读取一次的常用方法。 (第一次读取文件时,符号[如B_H_]还没有定义,所以ifndef为真,读取内容。从第二次,符号定义,内容被跳过。)

请注意,符号A_H_ 的名称是任意的,但通常人们使用大写字母书写的 header 名称。因此,只要您包含两个具有相同名称的不同 header ,该机制就会失败,除非您为守卫使用不同的名称。

您可能还想在谷歌上搜索 #pragma once,许多预处理器都支持它,但它不是标准的。

关于c - 将同一文件包含在 2 个文件中然后将它们包含在另一个文件中时出错(在 c 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18210823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com