
Detecting integer constant expressions in macros - BtdTom
https://lkml.org/lkml/2018/3/20/845
======
chrisseldo
"I'm in awe of your truly marvelously disgusting hack. That is truly a work of
art."

Ha. How should one take such a comment?

~~~
Someone1234
I'd take it as a complement.

Calling something a "disgusting hack," isn't inherently insulting, it is just
a description of how well self documenting and obvious its workings are, which
in this case is not at all. Whereas calling something a "work of art"
particularly from Linus is high praise.

And while there is some subjectivity to if something is a "hack" or not, the
original author doesn't even seem to contend that too much. They were more
interested in pointing out that this method likely works across compilers
(since it relies on less undefined behaviour than it might first appear).

In any case, it is a neat trick, that I wouldn't want to run across in a
codebase since I'd have to spend too long figuring it out.

~~~
chrisseldo
I agree with you - I think I would take it as a compliment as well. Also, I
take back my original post on what the best comment is in this post. This is
better:

"this will break the minds of everybody who ever sees that expression"

------
marshray
Go on, tell me again about how C++ compile-time metaprogramming is so horrible
...

~~~
Doxin
Just because doing it in C is worse doesn't mean the way its done in C++ isn't
bad.

~~~
DoofusOfDeath
> Just because doing it in C is worse doesn't mean the way its done in C++
> isn't bad.

Maybe... I hesitate to call it "bad" unless there's a clearly better solution
to the problem.

------
djhaskin987
The reply of the guy Linus is addressing is worth a read:
[https://lkml.org/lkml/2018/3/20/871](https://lkml.org/lkml/2018/3/20/871)

------
ksherlock
I didn't believe it would work but it does. It boils down to

    
    
        sizeof(int) == sizeof(void)
    

vs

    
    
        sizeof(int) == sizeof(int)
    

As a non-standard extension, in gcc (and thus clang and icc for compatibility,
it seems) void has a size of 1. In a conforming compiler, it's an error.

~~~
AstralStorm
Not quite.

Gcc it didn't fold it during preprocessing for a fully constant expression,
which is allowed. In which case always sizeof(void) is a valid answer. Which
is a compile error.

That is at least what C99 draft seems to say.

I'll check C11 draft next. Edit: same.

------
kuon
I've been writing C for 20 years and I have no idea what I am reading.

~~~
dilippkumar
> ((void _)((x)_ 0l))

It took me a while to figure that 0l is 0 with lowercase "L"

Whatever font that site uses makes it very very hard to distinguish l and 1.

~~~
db48x
Hilariously that site makes no choices at all about what font to use; it
merely puts the message text into a pre tag, making it monospaced. You should
choose a better font to display monospaced text in.

