Mescolando il codice Objective-C e C ++
-
12-09-2019 - |
Domanda
Ho un'applicazione Objective-C / C ++ che utilizza la funzionalità che è fornita da una libreria C ++.
Una delle classi del C ++ include un enum in questo modo:
class TheClass
{
public:
[...]
enum TheEnum
{
YES,
NO,
};
[...]
};
Tra cui un file di intestazione con la dichiarazione di classe superiore in un Objective-C file sorgente (* .mm) / C ++ (usando #import -se che matters-) farà la compilazione fallire in quanto il preprocessore sostituirà "Yes" il termine "(BOOL) 1" (e similmente "NO" con "(BOOL) 0").
C'è un modo per risolvere questo senza rinominare i valori della enum?
Soluzione
SI e NO sono costanti predefinite Objective-C, ha dichiarato nell'intestazione objc.h.
Si dovrebbe essere in grado di prevenire il preprocessore per espandere il "SI" e "NO" macro di. Questo può essere fatto a livello locale #undef
fing loro.
Ma tecnicamente, se si sta utilizzando una parola chiave il linguaggio come un identificatore, ci si può aspettare problemi. Non sarà scrivere una classe contenente un membro chiamato MAX_PATH
, vero?
Altri suggerimenti
Il #import
non importa - C ++ intestazioni in un file sorgente Objective-C ++ dovrebbero essere inclusi con #include
. Credo che, anche se non sono sicuro al 100%, che la scelta di includere direttiva (#include
vs #import
) determina quale preprocessore viene utilizzato.
Si potrebbe anche invertire la dichiarazione delle costanti nel enum, dal momento che per impostazione predefinita, i membri di un enum sono associati con numeri interi a partire da 0.
Per commenti, mi sbaglio. Sembra che si dovrà riscrivere l'enum. Siamo spiacenti: (