2016-01-27 9 views
13

Darf die gleiche Namensstruktur mit unterschiedlichen Definitionen in 2 verschiedenen c-Dateien im selben Projekt verwendet werden. Für z.Gleichnamige Struktur mit unterschiedlicher Definition in C

file1.c

typedef struct 
{ 
    unsigned int unVar;    

} abc; 

file2.c

typedef struct 
{ 
    int var; 
} abc; 

abc wird in den beiden Dateien verwendet. Wenn ich diese Dateien als Teil des gleichen Projekts kompiliere, gibt es keine Fehler, aber ich möchte verstehen, ob dies richtig ist.

+0

Nein, es gibt keine Neudefinition Fehler. –

+0

Hier ist eine ähnliche Frage http://stackoverflow.com/questions/3995940/casting-one-c-structure-intoandere. – niyasc

+5

@anuj Wenn sie sich in verschiedenen Kompilierungseinheiten befinden und wenn Sie diese Daten nicht zwischen ihnen austauschen (Casting Pointer), dann ist es sicher. Wenn es eine gute Übung ist ... nun, das ist eine andere Geschichte. –

Antwort

15

6.7.2.1 Struktur und Vereinigung Bezeich

  1. Das Vorhandensein einer Struktur-Deklaration-Liste in einer Struktur-oder-union-Spezifizierer einen neuen Typ erklärt, innerhalb einer Übersetzungseinheit.

Typen sind nur in diesem Fall innerhalb einer Übersetzungseinheit, eine C-Datei definiert.

Es gibt kein Problem, zwei Typen mit demselben Namen in zwei verschiedenen Übersetzungseinheiten zu definieren.

Diese beiden Typen sind jedoch nur kompatibel, wenn sie den in 6.2.7., P1 beschriebenen Regeln folgen. Die von Ihnen definierten Typen sind nicht kompatibel.

+1

Danke für Hilfe –

3

Dies ist eine Typdefinition. Es ist lokal für jede .c-Datei und es gibt keinen Grund, einen Fehler zu erhalten. Definitionen müssen in Header-Dateien gemacht werden und dann haben Sie kein Problem.

1

Es ist eine korrekte Verwendung, um zwei Strukturen mit demselben Namen in zwei verschiedenen * .c-Dateien zu definieren, da sie nur für den aktuellen Bereich in der * .c gelten, wo sie definiert ist.

Aber weiter würde ich nicht empfehlen, dies zu tun, um jede Verwirrung von Ihnen und von irgendeinem anderen Entwickler zu vermeiden, der mit zwei Arten des gleichen Namens arbeiten muss, die andere Sachen tun.

2

Die Namen der Symbole (Variablen, Funktionen) müssen innerhalb einer Übersetzungseinheit eindeutig sein.

Eine Übersetzungseinheit ist eine grundlegende Kompilierungseinheit für C und C++. Es besteht aus einer Quelldatei mit allen eingeschlossenen Dateien (entweder direkt oder indirekt).

In Ihrem Fall haben Sie zwei unabhängige Quelldateien, von denen jede eine Struktur definiert; aber sie "können sich nicht sehen", da sie sich in separaten Übersetzungseinheiten befinden.

Sie könnten jedoch beim Verknüpfen Probleme bekommen, wenn mehrere Symbole mit demselben Namen über Zielverknüpfungsobjekte existieren (solange diese Symbole exportiert werden, die mit dem Schlüsselwort static geändert werden können).

+2

Dies gilt für Symbole, die im globalen Gültigkeitsbereich definiert sind, aber Symbole können in lokalen Gültigkeitsbereichen neu definiert werden: sowohl Variablen als auch Strukturtags oder typedefs. – chqrlie

1

Jede Definition ist lokal in der Datei, in der sie angezeigt wird. Da Sie die Dateien separat kompilieren, sieht der Compiler nur einen nach dem anderen. Der Linker, der die Objektdateien miteinander verbindet, überprüft die Typkonsistenz nicht, er löst nur die Symbole nach Namen.

Wenn Sie einen st_localAscdData oder einen Zeiger auf eine st_localAscdData an eine Funktion von einem anderen Modul übergeben möchten, müssen Sie die Konsistenz zwischen den in den verschiedenen Modulen deklarierten Typen sicherstellen. Dies ist der Zweck von Header-Dateien. Gemeinsame Deklarationen gehören in Header-Dateien, die in allen Modulen enthalten sein müssen, die einen bestimmten Typ oder eine Funktion gemeinsam haben.

Die globale Typkonsistenz wird von der Programmiersprache C nicht erzwungen, auch nicht C++, es liegt in der Verantwortung des Programmierers. Codierungsregeln sind Richtlinien, um Programmierern zu helfen, Fallstricke von diesem Mangel zu vermeiden.

1

Sie erwarten einen neu definierten Fehler (was mit dem cpp-Compiler passieren wird), aber es wird nicht im C-Compiler passieren. Dieses Problem passiert nicht nur mit der Struktur, sondern auch mit alle Arten von Variablen. Ich habe eine Frage dazu gestellt und habe einige Details und Qualität zu beantworten.

Does C have One Definition Rule like C++?