2016-01-27 39 views
13

È consentito utilizzare la stessa struttura dei nomi con definizioni diverse in 2 file c diversi nello stesso progetto. Per es.Stessa struttura del nome con diversa definizione in C

file1.c

typedef struct 
{ 
    unsigned int unVar;    

} abc; 

file2.c

typedef struct 
{ 
    int var; 
} abc; 

abc viene utilizzato in entrambi i file. Quando compilo questi file come parte dello stesso progetto non ci sono errori, ma voglio capire se questo è l'uso corretto.

+0

No, non c'è alcun errore di ridefinizione. –

+0

Ecco una domanda simile http://stackoverflow.com/questions/3995940/casting-one-c-structure-into-another. – niyasc

+5

@anuj se si trovano in diverse unità di compilazione e se non si scambiano questi dati tra loro (puntatori di lancio), allora è sicuro. Se è una buona pratica ... beh, questa è un'altra storia. –

risposta

15

6.7.2.1 Struttura e sindacali prescrittori

  1. La presenza di una struttura-dichiarazione-list in una struttura-o-union-specifier dichiara un nuovo tipo, all'interno di un'unità di traduzione.

Tipi sono definiti solo all'interno di un'unità di traduzione, un file .c in questo caso.

Non c'è alcun problema con la definizione di due tipi con lo stesso nome in due diverse unità di traduzione.

Tuttavia, questi due tipi non sono compatibili a meno che non rispettino le regole descritte in 6.2.7., P1. I tipi definiti sono non compatibili.

+1

Grazie per l'aiuto –

3

Questa è la definizione del tipo. È locale per ogni file .c e non vi è alcun motivo per ottenere un errore. Le definizioni devono essere fatte nei file di intestazione e quindi non avrai questo problema.

1

È un utilizzo corretto definire due strutture con lo stesso nome in due file * .c diversi perché sono validi solo per l'ambito corrente in * .c in cui è definito.

Ma in più io non consiglierei di farlo per evitare qualsiasi confusione tra te e qualsiasi altro sviluppatore che deve lavorare con due tipi con lo stesso nome che fanno altre cose.

2

I nomi dei simboli (variabili ', funzioni) devono essere univoci all'interno di un'unità di traduzione .

un'unità di traduzione è un'unità di compilazione di base per C e C++. Consiste in un file sorgente, insieme a tutti i file inclusi (direttamente o indirettamente).

Nel tuo caso, hai due file sorgente indipendenti, ognuno dei quali definisce una struttura; ma "non possono vedere" l'un l'altro, poiché si trovano all'interno di unità di traduzione separate.

È possibile che si verifichino problemi durante il collegamento, se sono presenti più simboli con lo stesso nome su oggetti di collegamento di destinazione (purché questi simboli siano esportati, che possono essere modificati con la parola chiave static).

+2

Questo vale per i simboli definiti nell'ambito globale, ma i simboli possono essere ridefiniti in ambiti locali: sia variabili che tag di struttura o typedef. – chqrlie

1

Ogni definizione è locale al file in cui appare. Dato che si compila separatamente i file, il compilatore ne vede uno solo alla volta. Il linker che lega insieme i file oggetto non verifica la coerenza del tipo, risolve solo i simboli per nome.

Se si desidera passare un st_localAscdData o un puntatore a st_localAscdData a una funzione da un modulo diverso, è necessario garantire la coerenza tra i tipi dichiarati nei diversi moduli. Questo è lo scopo dei file di intestazione. Le dichiarazioni condivise appartengono ai file di intestazione, che devono essere inclusi in tutti i moduli che condividono un determinato tipo o funzione.

La coerenza di tipo globale non viene applicata dal linguaggio C, né C++ in parte, è responsabilità dei programmatori. Le regole di codifica sono linee guida per aiutare i programmatori a evitare le insidie ​​di questa mancanza.

1

Si aspetta un errore ridefinito (che si verificherà con il compilatore cpp) ma non avverrà nel compilatore C. Questo problema non si verifica solo con la struttura ma anche con tutti i tipi di variabile. Ho fatto una domanda per questo e ho qualche dettaglio e una risposta di qualità.

Does C have One Definition Rule like C++?