[cairo] return type of cairo_status_to_string ()

Daniel Goldman dagoldman at yahoo.com
Tue Aug 17 19:48:37 PDT 2010


> Daniel Goldman wrote:
> >  I know that the const keyword will not  allow you to assign twice to 
> That is incorrect. You can assign  to error_str many times:
>     const char*  error_str;
>     error_str = "A";
>      error_str = "B";
> What you can't do is assign to what error_str points  at:
>     error_str[0] = 'x'; // will not compile!

Oops! You're right. I'm wrong. But who would ever write:

char *error_str;

error_str = cairo_status_to_string (); // Assuming char * return type
error_str [0] = 'x'; // Nobody does this

Every C programming book I've ever read stresses not to do this. Yes, the 
compiler would tell someone who tried to do this. But they are going to make so 
many other mistakes I hardly see how it would matter.

And Joonas' is right that cairo_status_to_string () could allocate memory. But I 
don't see how using "const char *" return type would obviate the need for the 
caller to free the memory. If the called function allocates memory, doesn't it 
need to be freed, no matter what the return type?

Yes, you and Joonas have brought up two possible advantages for "const char *" 
return type. But I think both "advantages" are pretty weak, and the second 
(related to memory allocation) may be non-existent. The advantage of leaving off 
"const" is that const is confusing to many  programmers (apparently including 
myself), and does not fit in as well  with the way that most other functions are 
set up to normally just use  "char *". 

I would say in the real world it would be better to leave off const. I know 
there are many functions that use "const char *", such as strcpy (), strcat (), 
etc. On the other hand, skimming through the back of K+R, I don't see any 
functions with const char * return type. And what about the analogous function 
"char *strerror (int errnum)"? Perhaps you might suggest that strerror () uses a 
static array. But the man page says "This string must not be modified by the 
application". In any case, I think you see my point about "const char *" return 
type being unusual.

Anyway, I at least understand the issue better now. Even if I don't agree with 
the conclusion, it's a pretty minor thing.


More information about the cairo mailing list