C, "conflicting types for... " error
Asked Answered
C

2

5

Before I continue, here is the code which is giving me an error:

#define numScores 3             // the number of test scores which a student will have

struct btreenode{
int studentID;              // the ID number of the student at the current node

float scores[3];            // the 3 test scores of the student

float average;              // the average of the 3 test scores for the student

struct btreenode *left;     // pointer to left side of the tree
struct btreenode *right;    // pointer to right side of the tree
};

typedef struct btreenode *Node;

I'm getting the following error when I compile:

btreenode.h:17: error: redefinition of 'struct btreenode'
btreenode.h:28: error: conflicting types for 'Node'
btreenode.h:28: note: previous declaration of 'Node' was here

I have a block comment at the top so the line numbers are off, but

line 17 is the first line "struct btreenode{"

line 28 is the last line "typedef struct btreenode *Node"

Does anyone know why i'm getting these errors?

Conjunctive answered 12/2, 2014 at 4:20 Comment(9)
You mean struct btreenode *Node;?Burgess
No errors for me. See online demo of successful compilation.Florindaflorine
compiled successfully for me also.Flirtation
@Conjunctive might be this error occurs if you declared same structure in source file .c file also or header included twice in source.can you show source and header file.Flirtation
Looks like you're including the file with these definitions more than once. Use header guards.Mush
That's weird that 2 others can compile and I cannot. What are you guys using to compile? Maybe it's my compiler.Conjunctive
You define numScores but you never use it. And macro names are conventionally in all-caps.Payoff
Try using the preprocessor directive #pragma onceSuffragan
@Mush I added header guards to my .h files and that fixed it!Conjunctive
A
8

The header file should not be included more than once. So use macro in header file to avoid multiple inclusion.

#ifndef TEST_H__
#define TEST_H__

/*you header file can have declarations here*/

#endif /* TEST_H__*/

I am assumed that, this kind of approach is not there in your header file.

Authorship answered 12/2, 2014 at 4:38 Comment(0)
M
1

It looks as though your btreenode.h file is being included (directly or indirectly) multiple times... that's why the "previous declaration" and the "conflicting types" are in the same file at the same line (previous declaration on the first include, conflicting types when it runs into the same line on the next include).

You should use header guards (in btreenode.h) to prevent the header file code from being processed if it's already been included. At the top of the file, add:

#ifndef BTREENODE_H
#define BTREENODE_H

and at the end of the file add:

#endif // BTREENODE_H

That way, whatever is between those will only be compiled if BTREENODE_H was not already #defined from a previous inclusion.

Mush answered 12/2, 2014 at 4:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.