Sujet : Re: "not-const" qualifier for C
De : 643-408-1753 (at) *nospam* kylheku.com (Kaz Kylheku)
Groupes : comp.lang.cDate : 25. Apr 2024, 00:13:07
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <20240424133951.155@kylheku.com>
References : 1
User-Agent : slrn/pre1.0.4-9 (Linux)
On 2024-04-24, Thiago Adams <
thiago.adams@gmail.com> wrote:
Motivation sample:
>
struct X {
const char* const type;
};
>
struct X * make_x(){
struct X * p = malloc(sizeof *p);
if (p)
{
>
p->type = strdup("X"); // *** error, type is const ***
>
if (p->type == NULL)
{
free(p);
p = NULL;
}
}
return p; //ok
}
Different idea: allow all conversions without a cast which only
add qualifiers anywhere in the type:
struct X {
const char* const type;
};
struct mutable_X {
char* type;
};
struct X * make_x()
{
struct mutable_X * p = malloc(sizeof *p);
if (p)
{
p->type = strdup("X");
if (p->type == NULL)
{
free(p);
p = NULL;
}
}
return p; // ok: X differs from mutable_X only in having more qualifiers
}
Regarding freeing, we fix that with a different freeing interface:
extern void cvfree(const volatile void *p);
void x_destroy(struct X * p)
{
cvfree(p->type); //no warning: conversion only adds qualifiers
}
Freeing is not mutation; it makes sense to free via a qualified
pointer. Const objects can die, e.g:
{
const int x = 42;
}
The free function taking a void * is a misfeature in the C library.
-- TXR Programming Language: http://nongnu.org/txrCygnal: Cygwin Native Application Library: http://kylheku.com/cygnalMastodon: @Kazinator@mstdn.ca