Deutsch   English   Français   Italiano  
<vlnstq$2dkpd$8@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Julio Di Egidio <julio@diegidio.name>
Newsgroups: comp.lang.c
Subject: Re: So You Think You Can Const?
Date: Thu, 9 Jan 2025 08:12:58 +0100
Organization: A noiseless patient Spider
Lines: 50
Message-ID: <vlnstq$2dkpd$8@dont-email.me>
References: <vljvh3$27msl$1@dont-email.me> <20250107130809.661@kylheku.com>
 <vlm0hf$2dkpd$1@dont-email.me> <87a5c15ob0.fsf@bsb.me.uk>
 <vlm7o4$2dkpd$4@dont-email.me> <86frlt83pm.fsf@linuxsc.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Thu, 09 Jan 2025 08:12:59 +0100 (CET)
Injection-Info: dont-email.me; posting-host="e9d42356b81d42d02d68289eca9ecab3";
	logging-data="2544429"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1/GHqNAN+WAF/NmjWD+OYecFzu23502Wlg="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:tdZd1OpNppusaF16RsJpRzDQFkg=
Content-Language: en-GB
In-Reply-To: <86frlt83pm.fsf@linuxsc.com>
Bytes: 2996

On 08/01/2025 21:12, Tim Rentsch wrote:
> Julio Di Egidio <julio@diegidio.name> writes:
> 
> [...]
> 
>> Say my program unit implements AVL trees, with (conceptually
>> speaking) constructors/destructors, navigation and retrieval, and
>> of course manipulation (inserting, deleting, etc.).
>>
>> My idea (but I would think this is pretty "canonical" and, if it
>> isn't, I am missing the mark) is:  my public functions take/give
>> "sealed" instances (with const members to const data), as the user
>> is not supposed to directly manipulate/edit the data, OTOH of
>> course my implementation is all about in-place editing...
> 
> A better choice is to put the AVL code in a separate .c file,
> and give out only opaque types to clients.  For example (disclaimer:
> not compiled):
> 
>    // in "avl.h"
>    typedef struct avl_node_s *AVLTree;
>    // note that the struct contents are not defined in the .h file
> 
>    ... declare interfaces that accept and return AVLTree values ...
> 
>    // in "avl.c"
>    #include "avl.h"
>    struct avl_node_s {
>      // whatever members are needed
>    };
> 
>    ... implementation of public interfaces and any supporting
>    ... functions needed
> 
> 
> I might mention that some people don't like declaring a type name
> that includes the pointerness ('*') as part of the type.  I think
> doing that is okay (and in fact more than just okay; better) in the
> specific case where the type name is being offered as an opaque
> type.
> 
> Of course you could also make the opaque type be a pointer to a
> 'const' struct type, if you wanted to, but the extra "protection" of
> const-ness doesn't add much, and might actually cost more than it
> buys you because of the additional casting that would be needed.

Thank you, I like that...

-Julio