2012-12-04 14 views
5

In genere si includono intestazioni standard di libreria in C++ nel namespace globale, al di fuori di qualsiasi extern s, in questo modo:Qual è il comportamento specificato di includere un'intestazione C standard, in codice C++, all'interno di una specifica di collegamento (extern "C", extern "C++")?

#include <stdint.h> 

int main() { } 

ma ciò che è specificato che accada se si include un'intestazione libreria standard all'interno di uno? Per esempio:

extern "C" { 
#include <stdint.h> 
} 
int main() { } 

o

extern "C++" { 
#include <stdint.h> 
} 
int main() { } 

Va precisato ciò che dovrebbe accadere in entrambi i casi, o è definito dall'implementazione o addirittura non definita?

C++ 11 17.6.2.3p1 dice che C++ intestazioni libreria standard messo roba in extern "C++", ma la mia lettura provvisoria è che questo non si applica alle intestazioni C come <stdint.h>. C++ 11 17.6.2.2p3 dice che le intestazioni possono essere solo #include d al di fuori di qualsiasi "dichiarazione esterna"; questa frase appare solo in questo posto in C++ 11, quindi non sono sicuro che potrebbe essere applicata qui. (Sto assumendo C99 non ha nulla da dire su questo.)

(Per il mio caso particolare non è la possibilità di utilizzare <c*> intestazioni standard C++ s ', quindi ho davvero bisogno di sapere la semantica solo per la vecchia scuola Intestazioni C)

+3

su quale implementazione è impossibile utilizzare le intestazioni '' C++? E perché seguire lo Standard su un'implementazione così spezzata è rilevante? – rubenvb

+0

@rubenvb Lo sviluppo in Embedded/Kernel pone spesso limiti simili, sia tecnicamente che per scelta – SomeWittyUsername

+0

@icepack Sure, non sono richieste implementazioni indipendenti per includere tutte le parti della libreria standard, ma se è possibile fornire '* .h' allora anche l'intestazione 'c *' corrispondente. Perché qualsiasi implementazione dovrebbe scegliere di non avere entrambi? – bames53

risposta

5

Lo standard non dice nulla sulle intestazioni C che non fanno parte di C++. Precedente su C++ - 11, stdint.h/cstdint non faceva parte di C++. Spetta a quell'intestazione come si comporta quando è inclusa dal codice C++.

Se stai chiedendo sulle intestazioni C che sono parte di C++, l'unica differenza tra *.h e c* è che il primo non è richiesto di aggiungere i propri identificatori al std namespace (è facoltativa se lo fa oppure no,) mentre il secondo è richiesto per farlo (e può facoltativamente aggiungerli anche allo spazio dei nomi globale). Non c'è altra differenza. Non dovresti includere un'intestazione standard *.h all'interno di un blocco extern "C", poiché le intestazioni stesse si occupano dell'uso del collegamento C dove necessario.

Se si dispone di intestazioni C non standard che si desidera includere dal codice C++, è necessario esaminare tali intestazioni per determinare se è necessario includerle extern "C" o non caso per caso.

+0

Le intestazioni '* .h' sono solo necessarie per aggiungere i nomi allo spazio dei nomi globale ma possono anche aggiungerli allo spazio dei nomi' std'. Gli header 'c *' sono solo richiesti per aggiungere i nomi allo spazio dei nomi 'std', ma possono anche aggiungerli allo spazio dei nomi globale. – bames53

+0

@ bames53 Grazie. Fisso. –

Problemi correlati