Liste des Groupes | Revenir à cl c |
On 1/29/25 6:45 AM, bart wrote:
>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)
Which has undefined behavior, the deferencing of a null pointer.
>
Only if the implementation defines that behavior to be what we want,
can that be done. Most implementtions, that sort of behavior turns
out to work out, but it isn't mandated by the Standard.
Les messages affichés proviennent d'usenet.