I membri di array flessibili sono una caratteristica standard di C, a partire dallo standard 1999. Non esistono in C++.
Il tuo codice non è valido C++. Il suo avvolgimento in extern "C"
non lo modifica. Un compilatore C++ conforme deve almeno avvisare su di esso, e probabilmente dovrebbe rifiutarlo.
Accade che g ++ implementa membri di array flessibili in stile C come un'estensione di C++. Questo è perfettamente legittimo (i compilatori possono implementare estensioni), ma il suo uso non è portatile. Il suo comportamento, come quello di qualsiasi estensione di linguaggio, è definito dal compilatore, non dal linguaggio.
Se si compila con g++ -pedantic
, si otterrà un avvertimento:
c.cpp:5:21: warning: ISO C++ forbids zero-size array ‘buf’ [-Wpedantic]
char buf[];
^
Se si desidera utilizzare i membri di matrice flessibili in stile C in un programma C++ senza fare affidamento su un interno specifico compilatore, è puoi compilare il tuo codice C come C e collegarlo al tuo programma C++. Non è possibile rendere il tipo con il membro flessibile dell'array visibile al codice C++, ma è possibile utilizzarlo internamente nel codice C e forse fornire l'accesso ad esso nel codice C++ tramite un puntatore opaco. Vedere the C++ FAQ per informazioni sulla combinazione di C e C++ all'interno dello stesso programma. (Oppure puoi semplicemente usare l'estensione g ++, a costo di non essere in grado di compilare il tuo codice con altri compilatori.)
(Suppongo che tu stia utilizzando g ++. Alcuni altri compilatori probabilmente implementano estensioni simili.)
fonte
2015-08-07 15:53:16
Vedere di seguito, ma FAM di solito vengono compilati correttamente in C++. – Jason
Nota: Poiché 'get_buf() make_struct()' usa solo un puntatore a 'struct x', perché' struct x' è definito anche in 'blah.h'? – chux
Sto riportando questa domanda alla versione precedente. Se hai una nuova domanda, sei invitato a [chiedere] (http://stackoverflow.com/questions/ask), ma la tua ultima modifica sembra essere un tentativo di invalidare tutte le risposte che hai ricevuto. –