2016-04-14 14 views
6

Sono in procinto di creare un wrapper C attorno a una libreria C++. Un errore comune da fare mentre si fa questo è avere una dichiarazione di funzione e una definizione che non corrispondono per qualche motivo (errore di battitura, rinomina, argomento ottenuto aggiunto/rimosso, ecc.).Operatore dell'ambito dello spazio nomi globale sulla definizione della funzione

Ad esempio:

// enabledata.h 
MDS_C_API const char* motek_mds_enable_data_get_enable_command_name(); 

// enabledata.cpp 
const char* motek_mds_enable_data_enable_command_name() { ... } 

I nomi non corrispondono, ma a causa della mancanza di spazio per queste funzioni, non si tradurrà in qualsiasi errori di compilazione, e mostrerà solo molto più tardi su tutta la linea come errore di collegamento.

Voglio che il compilatore di aiutarmi a trovare questi errori utilizzando l'operatore scope globale in questo modo:

const char* ::motek_mds_enable_data_get_disable_command_name() { ... } 

Questo sarà ora si mostrano come un errore di compilazione, se la funzione non è stata ancora dichiarata, che è esattamente quello che voglio

Tuttavia, questo non funziona quando la funzione restituisce un typedef:

int32_t ::motek_mds_enable_data_is_enabled(const Data* a_Data) { ... } 

Questo si tradurrà in un tentativo di utilizzare int32_t come un ambito che di risultati dei corsi in un errore:

left of '::' must be a class/struct/union 

Esistono modi per farlo funzionare? Anche le migliori alternative sono benvenute.

Attualmente sto usando Visual Studio 2015 Update 2.

+0

Credo 'decltype (int32_t()) :: motek_mds ... 'dovrebbe funzionare (rende il tipo di ritorno uno" specificatore di tipo semplice ", che non" inghiotte "il' :: '), ma non ha il tempo di testarlo per te .... TC la proposta è meno brutta comunque. –

risposta

4

È sempre possibile parenthesize il dichiaratore-id:

int32_t (::motek_mds_enable_data_is_enabled)(const Data* a_Data) { ... } 
// ^        ^
Problemi correlati