2015-07-14 21 views
5

Se ho creato un modulo C che presenta una maniglia per l'utente con un puntatore a una struct avanti dichiarato, in questo modo:Aggiunta const-ness all'impugnatura opaco

typedef struct FOO_Obj *FOO_Handle; 

Se poi dichiara prototipi di funzione che usarlo come un parametro di const qualificato così:

void FOO_work(const FOO_Handle fooHandle); 

come è la -ness const applicata?

const struct FOO_Obj *FOO_Handle // A 
struct FOO_Obj *const FOO_Handle // B 
const struct FOO_Obj *const FOO_Handle // C 

O è UB?

risposta

2

B. (Non v'è alcun comportamento non definito con il codice è presentato.)

La chiamata di funzione

void FOO_work(const FOO_Handle fooHandle); 

è equivalente a

void FOO_work(struct FOO_Obj* const fooHandle); 

variabile fooHandle nella funzione sarà BeCode un puntatore const su un oggetto struct FOO_Obj non costante. Non sarà possibile aggiungere il qualificatore const a fooHandle per renderlo un puntatore a un oggetto const.

Invece, se si vuole avere un puntatore ad un oggetto const, e mantenere la struct nascosta, è necessario fare un altro typedef:

typedef const struct FOO_Obj* FOO_ConstHandle; 
+0

Grazie. Un puntatore 'const' su dati non-' coerenti' è quello di cui ho bisogno, quindi ero sulla strada giusta – Toby