2015-07-14 20 views
5

Gdybym stworzyliśmy moduł C, który przedstawia uchwyt dla użytkownika ze wskaźnikiem do przodu zadeklarowanej struktury, tak jak poniżej:Dodawanie const-ności do nieprzezroczystego uchwytem

typedef struct FOO_Obj *FOO_Handle; 

Gdybym wtedy zadeklarować prototypy funkcji, które używać go jako const wykwalifikowanego parametr wygląda następująco:

void FOO_work(const FOO_Handle fooHandle); 

jak przykładane jest const -ness?

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

A może to UB?

Odpowiedz

2

B. (Nie ma niezdefiniowane zachowanie przy kodzie przedstawionym).

Wywołanie funkcji

void FOO_work(const FOO_Handle fooHandle); 

jest równoważna

void FOO_work(struct FOO_Obj* const fooHandle); 

Variable fooHandle w funkcji będzie becode wskaźnik const dla nieruchomego obiektu struct FOO_Obj. Nie będzie można dodać kwalifikatora const do fooHandle, aby stał się on wskaźnikiem do obiektu const.

Zamiast tego, jeśli chcesz mieć wskaźnik do obiektu const, i zachować struct ukryty, trzeba dokonać innego typedef:

typedef const struct FOO_Obj* FOO_ConstHandle; 
+0

Dzięki. Niezbędny jest wskaźnik 'const' dla danych innych niż' constst', więc byłem na dobrej drodze – Toby