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)
su quale implementazione è impossibile utilizzare le intestazioni '' C++? E perché seguire lo Standard su un'implementazione così spezzata è rilevante? –
rubenvb
@rubenvb Lo sviluppo in Embedded/Kernel pone spesso limiti simili, sia tecnicamente che per scelta – SomeWittyUsername
@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