Sizeof is surprisingly difficult to parse in C

20 pointsposted 11 hours ago
by jandeboevrie

5 Comments

glouwbug

a minute ago

It's a unary operator, kind of like ~ or !, which can apply to parenthesis (), until it meets a type, then the parenthesis are mandatory:

    int x;
    sizeof x;     // okay
    sizeof (x);   // okay
    sizeof int;   // not okay
    sizeof (int); // okay
It's a weird double rule to parse, especially since the strongest bending precedence typically expects an alpha numeric identifier at that point in the recursive descent, so you get weird rules like:

    read_prefix():
        is peak() '!': ...
        is peak() '~": ...
        is alnum(peak())
            maybe alnum is sizeof?
                wait, it wasn't sizeof? it was an identifier? long rewind
        is peak() '+': ...

wren6991

2 hours ago

> (everything here also applies to c2y's newly introduced _Countof)

Stop the press, they're adding what? So I don't have to keep adding #define count_of(arr) (sizeof(arr) / sizeof(*arr)) to every codebase and living with its failure modes?

I'm really loving C's character arc at the moment, where they keep going back to fix old problems instead of piling everything and the kitchen sink into the language.

HexDecOctBin

an hour ago

Yeah, despite puritanical hand-wringing over C23, I do like both the discipline and the selectivity with WG14 has shows (and I say this as a card-carrying C++ hater).

I do wish they will start looking into proper arrays since there is already a syntax for this can can be augmented semantically:

    int func (int arg[static 5])

high_na_euv

an hour ago

I feel like what you struggle with is expression parsing, not sizeof itself?

inigyou

2 hours ago

Wait, they added a new operator and didn't fix that parsing stupidity by always requiring parentheses?