Why is the endptr parameter to strtof and strtod a pointer to a non-const char pointer?

后端 未结 2 546
长情又很酷
长情又很酷 2021-01-03 20:39

The standard C library functions strtof and strtod have the following signatures:

float strtof(const char *str, char **endptr);
dou         


        
2条回答
  •  一生所求
    2021-01-03 21:38

    The reason is simply usability. char * can automatically convert to const char *, but char ** cannot automatically convert to const char **, and the actual type of the pointer (whose address gets passed) used by the calling function is much more likely to be char * than const char *. The reason this automatic conversion is not possible is that there is a non-obvious way it can be used to remove the const qualification through several steps, where each step looks perfectly valid and correct in and of itself. Steve Jessop has provided an example in the comments:

    if you could automatically convert char** to const char**, then you could do

    char *p;
    char **pp = &p;
    const char** cp = pp;
    *cp = (const char*) "hello";
    *p = 'j';.
    

    For const-safety, one of those lines must be illegal, and since the others are all perfectly normal operations, it has to be cp = pp;

    A much better approach would have been to define these functions to take void * in place of char **. Both char ** and const char ** can automatically convert to void *. (The stricken text was actually a very bad idea; not only does it prevent any type checking, but C actually forbids objects of type char * and const char * to alias.) Alternatively, these functions could have taken a ptrdiff_t * or size_t * argument in which to store the offset of the end, rather than a pointer to it. This is often more useful anyway.

    If you like the latter approach, feel free to write such a wrapper around the standard library functions and call your wrapper, so as to keep the rest of your code const-clean and cast-free.

提交回复
热议问题