whoKnows
whoKnows

Reputation: 924

Is there a way to redefine a struct?

I am not trying to have two different structs with the same name, but rather defining the same exact struct two different times (probably in different header files).

For example:

struct foo {
    int bar;
};

struct foo {
    int bar;
};

gives an error.

Upvotes: 1

Views: 12782

Answers (4)

Edwin Buck
Edwin Buck

Reputation: 70959

The way to do this is to surround your struct with preprocessor instructions

#ifndef STRUCT_FOO
#define STRUCT_FOO

struct foo {
    int bar;
};

#endif /* STRUCT_FOO */

#ifndef STRUCT_FOO
#define STRUCT_FOO

struct foo {
    int bar;
};

#endif /* STRUCT_FOO */

this has the effect of only defining struct foo once. In combination with the commonly accepted practice of putting such an item in a file called foo.h, like so

#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H

struct foo {
    int bar;
};

#endif /* INCLUDE_FOO_H */

it also protects against a person doing

#include "foo.h"
#include "foo.h"

(rest of code)

As far as redefining the struct, that is not permitted in the C language; however, you can do some things that approximate a non-full redefine. I recommend avoiding them, as they tend to only make the code more obscure and difficult to maintain.

Upvotes: 2

David Whiteside
David Whiteside

Reputation: 41

No.

You should seperate the struct in another header, it sounds like you may be organizing your code poorly and should rethink the design.

You could use a ifndef:

#ifndef NAMEDEF
struct name {
int val;
};
#define NAMEDEF
#endif

Although, I must reiterate that you need to rethink how your header files are designed and put this struct in a common header.

Its also possible to use a foreward declaration:

struct name;

void function() {
}

Upvotes: 1

John3136
John3136

Reputation: 29266

Short answer: No

The compiler isn't that smart - you already have struct foo, so you can't have another struct foo even if you think it is the same as the first one.

Upvotes: 2

Jonathon Reinhart
Jonathon Reinhart

Reputation: 137537

No.

There is absolutely no point in doing this. If you have a structure that is to be used by multiple compilation units, put it in a .h header file, and #include it from those .c files. Or, if you need it in multiple header files, just include the common header file from those.

Now if you don't need the actual structure definition, but rather just need to declare that it exists (so you can create pointers to said struture), you can use a forward declaration:

 struct foo;    // defined elsewhere

 void somefunc(struct foo *ptr);

Upvotes: 2

Related Questions