有关结构体重新定义和函数类型冲突的错误

问题描述 投票:0回答:1

我有一个给定的头文件 (given1.h),其中包含我的函数原型、定义、结构定义和库。我想添加一个名为 helper.h 的帮助程序文件,其中包含一个名为

int readDataFile(char fileName[30], struct Animal testData[NUM_TEST_DATA]);

的函数原型

将原型添加到given1.h似乎是明智的,但我必须创建一个helper.h。由于函数原型具有来自given1.h和NUM_TEST-DATA的struct Animal,因此我需要添加#include“given1.h”,然后将这两个标头包含在我的主文件和函数定义文件中。 唯一的问题是,当我这样做时,我收到一条错误消息

error: redefinition of ‘struct Animal’
   31 | struct Animal {
      |        ^~~~~~
given1.h:31:8: note: originally defined here
   31 | struct Animal {
      |        ^~~~~~
given1.h:40:5: error: conflicting types for ‘readFromFile’; have ‘int(char *, struct Animal *)’
   40 | int readFromFile (char fName [30], struct Animal dataZoo [NUM_SAMPLES]) ;
      |     ^~~~~~~~~~~~
givenA1.h:40:5: note: previous declaration of ‘readFromFile’ with type ‘int(char *, struct Animal *)’
   40 | int readFromFile (char fName [30], struct Animal dataZoo [NUM_SAMPLES]) ;

等等我的所有功能。我可以做什么来解决这个问题?

我确实尝试将我的原型放在给定的A1中,它给了我一个隐式的微分警告,但即便如此,它也必须放入helper.h中。由于某种原因,当我将原型放入 main 中时,程序仅在没有警告/错误的情况下运行。我对为什么它只在原型处于 main 时运行的想法为零。如何使用给定的 1.h 中的正确参数声明此原型,而不会导致有关结构重新定义的错误以及有关所有函数的类型冲突的错误。我还使用 make 文件来编译它。

c function struct prototype header-files
1个回答
0
投票

出现结构体重新定义错误是因为您在单个翻译单元的多个位置(即源文件、它包含的标头、标头那些包含等)中包含给定的1.h,导致结构体定义出现在多个地方。

您可以通过在头文件中添加 headerguards 来解决此问题。这可以防止内容被多次包含。例如:

给定1.h:

#ifndef GIVEN_H
#define GIVEN_H

struct Animal {
   ...

int readFromFile (char fName [30], struct Animal dataZoo [NUM_SAMPLES]) ;

...

#endif
© www.soinside.com 2019 - 2024. All rights reserved.