Same name structure with different definition in C

2020-08-12 03:34发布

问题:

Is it allowed to use same name structure with different definitions in 2 different c files in the same project. For eg.

File1.c

typedef struct
{
    unsigned int unVar;             

} abc;

File2.c

typedef struct
{
    int var;
} abc;

abc is used in both the files. When i compile these file as part of same project there are no errors, but i want to understand whether this is correct usage.

回答1:

6.7.2.1 Structure and union specifiers

  1. The presence of a struct-declaration-list in a struct-or-union-specifier declares a new type, within a translation unit.

Types are defined only within a translation unit, a .c file in this case.

There is no problem with defining two types with the same name in two different translation units.

However those two types are not compatible unless they follow the rules described in 6.2.7., p1. The types you defined are not compatible.



回答2:

This is type definition. It is local for each .c file and there is no reason to get error. Definitions have to be made in header files and then you will not have such problem.



回答3:

Symbols' names (variables', functions) must be unique within a translation unit.

A translation unit is a basic compilation unit for C and C++. It consists of a source file, along with all included files (either directly or indirectly).

In your case, you have two independent source files, each defining a struct; but they "can't see" each other, as they are within separate translation units.

You might get into trouble, however, during linking, if there are multiple symbols with the same name across target linking objects (as long as these symbols are exported, which can be modified with static keyword).



回答4:

It is a correct usage to define two structs with the same name in two different *.c files because they are only valid for the current scope in the *.c where it is defined.

But further I would not recommend to do this to avoid any confusion of you and any other developer who has to work with two types of the same name that do doing other things.



回答5:

Each definition is local to the file in which it appears. Since you compile the files separately, the compiler only sees one at a time. The linker binding the object files together does not verify type consistency, it only resolves symbols by name.

If you want to pass a st_localAscdData or a pointer to a st_localAscdData to a function from a different module, you must ensure consistency between the types declared in the different modules. This is the purpose of header files. Shared declarations belong in header files, that must be included in all modules that share a given type or function.

Global type consistency is not enforced by the C language, nor C++ to some extend, it is the programmers responsibility. Coding rules are guidelines to help programmers avoid pitfalls from this shortcoming.



回答6:

You expect a redefined error (which will happen with cpp compiler) but it won't happen in C compiler. This issue not just happen with structure but also with all kinds of variable. I have make a question for this and have some detail and quality answer.

Does C have One Definition Rule like C++?