Strano Eclipse C ++ comportamento #define
-
19-09-2019 - |
Domanda
(Un caso di più di fare affidamento su un IDE)
Ho qualche codice legacy C che compilo come C ++ a scopo di test Unit. Il sorgente C è C ++ a conoscenza in quanto condizionalmente definisce in base all'ambiente.
es. (PRIVATE
decide di static
):
#if!defined __cplusplus
#define PRIVATE1 PRIVATE
#endif
...
PRIVATE1 const int some_var;
Il problema è che proprio non riesco a scoprire cosa PRIVATE1
risolve o si trova in C ++, il compilatore si lamenta di ridefinizione se posso aggiungere una dichiarazione, ma non indica dove?
Ho cercato il mio MinGW / GCC include il percorso, la specifica C ++ ISO ei libri C ++ a mia disposizione è stata senza alcun risultato.
Modifica:
Certo che ho controllato la linea di comando e makefile prima dell'inserimento.
Soluzione 4
Eclipse C ++ gestite progetto sono un po ', beh stupido!
Se un progetto è dichiarato C ++ si basa ancora è costruire su estensione del file, quindi .h file di pre-elaborato come C e non C ++ intestazione che tira in un #define PRIVATE1 da un altro file di intestazione simile avvolto da:
#ifdef __cpluplus.
Il progetto viene poi collegato da g ++.
Altri suggerimenti
Non c'è niente di simile in ISO C ++ spec. Molto probabilmente, PRIVATE1
(così come PRIVATE
) sono definiti in altre parti del progetto. Si noti che questo non ha bisogno di essere un #define
in un file .h - può anche essere definito tramite le opzioni del compilatore nel makefile. Io suggerirei di fare un grep completa sulla directory del progetto.
Se PRIVATE1
decide di PRIVATE
, e PRIVATE
decide di static
, poi decide di PRIVATE1
static
.
E 'improbabile (ma non impossibile) che essi sono definiti da MinGW sé. Macro definite dal C ++ o C attuazione dovrebbe iniziare con un trattino.
La cosa migliore è quello di guardare l'output del preprocessore. Non hai inviare quale compilatore che si sta utilizzando, ma se si controlla la documentazione, la maggior parte hanno la possibilità di "pre-elaborazione di file" che creerà un file con tutte le macro sostituiti. Questo potrebbe essere in grado di aiutare a capire cosa sta succedendo. In Visual Studio si utilizza l'opzione / E (in C / C ++ -> Preprocessor-> Genera file pre-elaborato) che si trasformerà in foo.c foo.i. Questo file sarà generalmente enorme rispetto al file sorgente originale, in modo da scorrere verso il basso per vedere il codice.
Molto probabilmente in C ++ è definito in modo da, beh, "privato:".
Si può dichiarare una funzione con PRIVATE1? Se è così, basta scrivere una funzione in questo modo:
PRIVATE1 void Foo() {
// __FUNCSIG__ in Visual Studio, not sure about GCC
std::cout << __FUNCSIG__ << std::endl;
}