Deutsch   English   Français   Italiano  
<864j1h1tmd.fsf@linuxsc.com>

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: Tim Rentsch <tr.17687@z991.linuxsc.com>
Newsgroups: comp.lang.c
Subject: Re: Results of survey re. a new array size operator
Date: Wed, 29 Jan 2025 08:18:18 -0800
Organization: A noiseless patient Spider
Lines: 83
Message-ID: <864j1h1tmd.fsf@linuxsc.com>
References: <87a5bgsnql.fsf@gmail.com> <20250124135623.00004479@yahoo.com> <QgNkP.76380$ZEZf.54113@fx40.iad> <20250124115250.760@kylheku.com> <afUkP.928261$2xE6.342839@fx18.iad> <20250124165243.678@kylheku.com> <868qqu2bnl.fsf@linuxsc.com> <vnd4db$2bqlb$2@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Injection-Date: Wed, 29 Jan 2025 17:18:18 +0100 (CET)
Injection-Info: dont-email.me; posting-host="ba8d9ca2da4b9314498ee7469992f70e";
	logging-data="2572767"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+M8QOy+5iVxDfzXXwoH/rbxVEc9StteIw="
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Cancel-Lock: sha1:h7wCXbiij5PNUI9EuVjYqNJS+lo=
	sha1:jQozhqmN1r73CyZcASq/ZIHpV9I=
Bytes: 4334

bart <bc@freeuk.com> writes:

> On 29/01/2025 09:48, Tim Rentsch wrote:
>
>> Kaz Kylheku <643-408-1753@kylheku.com> writes:
>>
>>> On 2025-01-24, Scott Lurndal <scott@slp53.sl.home> wrote:
>>>
>>>> Kaz Kylheku <643-408-1753@kylheku.com> writes:
>>>>
>>>>> On 2025-01-24, Scott Lurndal <scott@slp53.sl.home> wrote:
>>>>> You can define
>>>>>
>>>>>   #define arraysize (x) (sizeof (x) / sizeof ((x)[0))
>>>>
>>>> You can, but you don't need to.
>>>
>>> The repetition in things like:
>>>
>>>    sizeof foo->bar.buf / *sizeof foo->bar.buf
>>>
>>> is just irksome.  Why do I have to say that thing twice,
>>> to get its number of elements?
>>>
>>>> Often readability suffers
>>>> when you use macros, not to mention the other quirks of
>>>> C macro use (in C++, a constexpr function might be
>>>> suitable, but the naming being arbitrary (e.g. arraysize,
>>>> NUM_ELEMENTS, SIZE, et alia) doesn't aid in readability
>>>> or maintainability.
>>>
>>> The naming being arbitrary is the argument for standardizing the
>>> name for the macro and sticking it into, for instance, <stddef.h>.
>>>
>>> If we didn't have offsetof there, we might have to deal with
>>> OFFSETOF, offsetof, offset, member_offset, and others.
>>
>> That's a flawed analogy.  A macro to compute the number of
>> elements in an array can be done in standard C.  The
>> functionality of offsetof cannot be done in standard C, and
>> that's what it needs to be in the standard library.
>
> Can't it?  The various versions I've seen, including mine, look
> like this:
>
>   #define offsetof(a,b) (size_t) &( ((a*)0) -> b)

That form of expression is not guaranteed to work, as other
responses have explained.

> As for the other point that was made, when looking at open source
> code, every other program seems to contain macros like
>
>   MAX
>   ARRAYLEN
>   STREQ
>
> But with assorted spellings (the first program I looked at today used
> MZ_MAX).
>
> However, every other program also seems to use typedefs to define
> their own versions of INT32 etc, even with stdint.h type being
> available for 25 years.

Probably historical baggage.  It was ten years after C89 that C99
added <stdint.h>, and probably five more years before people
started using C99 regularly.  And it didn't help that Microsoft,
in their near-infinite wisdom, didn't ever really support C99,
and waited until C11 before doing an implementation conforming to
a current C standard.  So the pre-C99 names had many years to
become entrenched, and after that there was no sufficiently
motivating reason to change them.  If it ain't broke don't fix
it.

> So being in the standard is not enough if the official name is
> too ugly or it is fiddly to type.

Personally I think the type names added in <stdint.h> are both
ugly and almost always a bad choice for other reasons.  That
said, I note that uint32_t and uint64_t have become nearly
ubiquitous (and also uint8_t, which is completely baffling, since
unsigned char can be used instead, along with some form of static
assertion for people who are overly obsessive).