c - Choosing const vs. non-const pointer for user data -


consider simple, re-usable library. has object current state, , callback function feed input.

typedef struct context_s context_t;  typedef size_t (*getbytes_t) (context_t * ctx, uint8_t * bytes, size_t max);  struct context_s {     getbytes_t bytefunc;     void * extra;     // more elements };  void init(context_t * ctx, getbytes_t func); int getnext(context_t * ctx); // calls callback when needs more bytes 

user might need data callback (like file pointer). library provides functions have 1 pointer:

void setextra(context_t * ctx, void * ext); // may called after init void * getextra(context_t const * ctx); // may called in callback 

however, if user data constant, require him cast constness away before setting data. change functions take/return const, require cast in callback, if data should not constant.

void setextra(context_t * ctx, void const * ext); void const * getextra(context_t const * ctx); 

third alternative hide cast inside function calls:

void setextra(context_t * ctx, void const * ext); void * getextra(context_t const * ctx); 

is idea hide cast in case?

i'm trying find balance usability , type safety. since using void* pointers, lot of safety gone already.

or overlooking worthy of consideration?

the c standard library has similar problems. notoriously, strchr function accepts const char * parameter , returns char * value points given string.

this deficiency in c language: provisions const not support ways in const might reasonably used.

it not unreasonable follow example of c standard: accept pointer const and, when giving calling software, provide pointer non-const, in third example.

another alternative define 2 sets of routines, setextra , getextra use non-const, , setextraconst , getextraconst use const. these enforced @ run-time bit records whether set context const or non-const. however, without enforcement, helpful because make errors more visible in calling code: reading code see setextraconst used set data , getextra (non-const) used data. (this might not if calling code convoluted , uses const data in cases , non-const data in others, better catch more errors fewer.)


Comments

Popular posts from this blog

java.util.scanner - How to read and add only numbers to array from a text file -

rewrite - Trouble with Wordpress multiple custom querystrings -