函数已在C中定义错误

函数已在C中定义错误,c,C,我有一个名为helper.h的头文件,它需要包含在main1.c和main2.c中,所以我在这两个文件中都包含了helper.h文件(没有包含,我得到了错误),但我仍然得到了错误,helper.h中的函数已经定义好了。如何使用#ifndef?消除此错误,这表明您已经在头中定义了一个函数,即实现了它。你不能这样做,你应该只有声明,即原型 添加一个新的C文件helper.C,它实现了这些函数 然后编译每个C文件并将它们链接在一起(main1.o+helper.o和main2.o+helper.o),

我有一个名为
helper.h
的头文件,它需要包含在
main1.c
main2.c
中,所以我在这两个文件中都包含了
helper.h
文件(没有包含,我得到了错误),但我仍然得到了错误,
helper.h
中的函数已经定义好了。如何使用#ifndef?

消除此错误,这表明您已经在头中定义了一个函数,即实现了它。你不能这样做,你应该只有声明,即原型

添加一个新的C文件
helper.C
,它实现了这些函数


然后编译每个C文件并将它们链接在一起(
main1.o
+
helper.o
main2.o
+
helper.o
),以形成两个程序。

这表示您已经在头中定义了一个函数,即实现了它。你不能这样做,你应该只有声明,即原型

添加一个新的C文件
helper.C
,它实现了这些函数


然后编译每个C文件并将它们链接在一起(
main1.o
+
helper.o
main2.o
+
helper.o
)以形成两个程序

#ifndef HELPER_H
#define HELPER_H

我希望这能解决您的问题。

在helper.h文件中,在开始处添加以下行

#ifndef HELPER_H
#define HELPER_H

我希望这能解决您的问题。

您能显示.h文件的内容吗?不要将函数的定义放在
helper.h
中,因为
ifndef
只防止在单个翻译单元中包含多个内容。您是否在使用?@hmjd:或者,如果必须将函数定义放在标题中,将其设置为
静态内联
,或类似。你是对的;在C@JonathanLeffler中定义一个函数是不寻常的,而且通常是错误的。谢谢你,我从来没有考虑过这一点。但是,我认为
inline
是对编译器的请求,而不是对编译器的指令(即不保证)?你能显示.h文件的内容吗?不要将函数的定义放在
helper.h
中,因为
ifndef
只防止在单个翻译单元中包含多个内容。你到底在使用吗?@hmjd:或者,如果你必须将函数定义放在头中,则将其设置为
静态内联
,或者诸如此类。你是对的;在C@JonathanLeffler中定义一个函数是不寻常的,而且通常是错误的。谢谢你,我从来没有考虑过这一点。然而,我认为
inline
是对编译器的请求,而不是对编译器的指令(即不保证)?好吧,你可以这样做(例如,如果只有一个C文件包含头文件),但这是相当不明智的:-)也许“不应该”是更好的选择。好吧,你可以这样做(例如,如果只有一个C文件包含头文件),但这是不明智的:-)也许“不应该”是更好的选择。这种机制,加上末尾匹配的
#endif
,可以防止在单个翻译单元(TU)中包含两次标题。然而,问题中的问题似乎是,当两个单独的TU都包含头时,函数会被定义两次。这表明函数是在标题中定义的,而多重包含预防机制在这里没有帮助。欢迎使用堆栈溢出。这种机制,加上末尾匹配的
#endif
,可以防止在单个翻译单元(TU)中包含两次标题。然而,问题中的问题似乎是,当两个单独的TU都包含头时,函数会被定义两次。这表明函数是在标题中定义的,而多重包含预防机制在这里没有帮助。