2015-04-17 15 views
6

Sto cercando di trovare tutti i posti in cui #include è inserito all'interno del blocco externC. È possibile controllarlo usando il preprocessore? Vorrei fare aggiungere qualcosa di simile ai miei file di intestazione:Come rilevare che l'extern "C" è in vigore

#ifdef EXTERN_C_IS_IN_EFFECT 
#error File included from extern "C" block! 
#endif 

Sto anche cercando altri modi per fallire la compilazione in tal caso, ad esempio, usa qualche attributo speciale. Sto usando gcc 4.4.7.

ho definito macro riportata di seguito e quindi utilizzarlo in ogni colpo di testa che ha bisogno di protezione contro l'inclusione nella externC blocco:

#define ASSERT_NO_EXTERN_C void assert_no_extern_c(int); void assert_no_extern_c(double); 
+7

'extern' non viene notato dal preprocessore. –

+1

Se è necessario trovare tutti i file in cui è presente un "C" extern, è possibile eseguire il progetto del codice con tutti i file da cercare nel proprio IDE preferito e eseguire una ricerca in tutto il progetto/soluzione/... – Incubbus

+0

@ πάνταῥεῖ Hm. '#define extern static'? –

risposta

11

Forse è possibile definire 2 prototipi di funzioni con lo stesso nome e diversi parametri. Riceverai avvertimenti in caso di blocco "C" extern. Ed è consentito in C++.

+0

Grazie! Questo funziona per me: void assert_no_extern_c (int); void assert_no_extern_c (double); –

6

Questo non è possibile perché il preprocessore viene eseguito prima di qualsiasi analisi sintattica è fatto; cioè, il preprocessore non sa nemmeno cosa sia extern "C" e la sua azione non può dipendere nemmeno dalla presenza di una tale direttiva.

Tuttavia, le specifiche di collegamento sono nidificate, quindi anziché verificare che il compratore non abbia specificato extern "C", è possibile posizionare l'intestazione all'interno di una specifica extern "C++" per assicurarsi che utilizzi il collegamento C++.

Problemi correlati