frontpage.
newsnewestaskshowjobs

Open Source @Github

fp.

Open in hackernews

Detecting if an expression is constant in C

https://nrk.neocities.org/articles/c-constexpr-macro#detecting-if-an-expression-is-constant-in-c
49•signa11•1y ago

Comments

wahern•1y ago
> This works. But both gcc and clang warn about the enum being anonymous... even though that's exactly what I wanted to do. And this cannot be silenced with #pragma since it's a macro, so the warning occurs at the location where the macro is invoked.

You can use _Pragma instead of #pragma. E.g.

  #define C(x) ( \
    _Pragma("clang diagnostic push") \
    _Pragma("clang diagnostic ignored \"-Wvisibility\"") \
    (x) + 0*sizeof(void (*)(enum { tmp = (int)(x) })) \
    _Pragma("clang diagnostic pop") \
  )
EDIT: Alas, GCC is a little pickier about where _Pragma is allowed so you may need to use a statement expression. Also, it seems GCC 14 doesn't have a -W switch that will disable the anonymous enum warning.
pjc50•1y ago
It's remarkable that people will say that doing this kind of thing is better than learning a language which actually lets you enforce this with the type system.

(or even just insist that users use the version of the language which supports "constexpr"!)

oguz-ismail•1y ago
What language is that? Is it available everywhere (everywhere) C is?
mitthrowaway2•1y ago
Indeed, usually if I'm using C these days it's because I only have access to a c compiler for my target platform, or because I'm modifying an existing C codebase.
uecker•1y ago
I do not think anybody said this. The point is that these macros work for early versions of C. If you need to support early versions of C, learning another language is not a solution. If you don't have to, you can use C23's constexpr.
trealira•1y ago
C used to seem like a beautiful and simple language to me, but as I used it and learned more about it, it seemed more complex under the surface, and kind of janky as well. It's just utilitarian.
wat10000•1y ago
Learning such a language doesn’t mean I can use it.
o11c•1y ago
The problem is that no such language exists.

There are many languages that provide one particular feature that C doesn't provide, but they do this at the cost of excluding numerous other features that C widely relies on.

kjs3•1y ago
"I have no idea what problem you're trying to solve, what the constraints are, what the use cases might be, what tools are available on the platform, what the job or regulations require, what the skillsets of the people involved are, what the timeline is...but I'm absolutely, unshakably certain that I have a magic bullet that will make all your problems go away."

FTFY.

sleirsgoevy•1y ago
The Linux kernel has even a way to determine whether the expression is compile-time, WITHOUT aborting compilation in either case.

The trick is this (copied vebratim from Linux):

#define __is_constexpr(x) (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))

Explanation: if x is a constant expression, then multiplying it by zero yields a constant 0, and casting a constant 0 to void* makes a null pointer constant. And the ternary expression, if one of its sides is a null pointer constant, collapses to the type of the other side (thus the type of the returned pointer will be int*, and the sizeof will match). And if x was not constant, then the lefthand side would not be considered a null pointer constant by type inference, the type of the ternary expression will be void*, and the sizeof check will not match.

With a few more clever tricks, it's even possible to implement a compile-time "type ternary expression", like this: TYPE_IF(2 * 2 == 4, int, long). This is left as an exercise for the reader.

amelius•1y ago
This reminds me of the days when Boost was a thing. It was full of tricks like this.
usrnm•1y ago
It still is a thing, though.
cperciva•1y ago
With a few more clever tricks...

I did this with my PARSENUM macro (https://github.com/Tarsnap/libcperciva/blob/master/util/pars...) to parse strings into floating-point, unsigned integer, or signed integer types (and check bounds) using a single interface.

bobbyi•1y ago
I thought this would work:

#define C(x) (sizeof(char[x]), x)

sizeof is a compile-time operation so x need to be known at compile time.

It didn't work as expected. It turns out there is an exception and the standard says that sizeof is actually calculated at runtime specifically for variable length arrays:

> The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

I Don't Understand Quantum Physics (2018)

https://www.southampton.ac.uk/~doug/quantum_physics/index.html
119•rramadass•3h ago•81 comments

OBS Studio 33

https://github.com/obsproject/obs-studio/releases/tag/33.0.0
225•pentagrama•8h ago•73 comments

Kimi K3.1 Pro and K3.1 Pro Highspeed

https://www.kimi.ai/blog/kimi-k3-1-pro
957•Jowsey•20h ago•574 comments

Physicists trap a single antimatter particle for a month

https://www.scientificamerican.com/article/physicists-trap-a-single-antimatter-particle-for-a-month/
109•mooreds•2d ago•43 comments

Around a dozen banking apps began specifically permitting GrapheneOS

https://grapheneos.social/@GrapheneOS/117492375462459244
238•privacyishuman•11h ago•62 comments

Appreciating the beauty of all your body's scars and scratches

https://1000awesomethings.com/2026/10/08/576-appreciating-the-beauty-of-all-your-bodys-scars-and-...
18•surprisetalk•2d ago•8 comments

Today, we hacked what we'd set out to hack: the iPhone

https://blog.calif.io/p/iphone
938•pavel_lishin•20h ago•608 comments

Twelve years of distributed SQLite

https://philipotoole.com/twelve-years-of-distributed-sqlite/
248•otoolep•11h ago•40 comments

Node2Shell evolves to HTTP2Shell, blast radius affects many HTTP libs and apps

https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497
59•theanonymousone•5h ago•33 comments

How to run a city builder on 16 MHz

https://larstofus.com/2025/11/16/how-to-run-a-city-builder-on-12-5-mhz/
40•rex64•2d ago•12 comments

How close can pure functional programming get to C?

https://rtfeldman.com/fp-vs-c
153•stmonty•9h ago•29 comments

Apple Music 404 Not Found

https://music.apple.com/this-url-doesnt-exist
810•frizlab•1d ago•243 comments

Local Wikipedia: Wikipedia, but only for things a half hour walk from you

https://edjefferson.com/localwiki/
1420•sohkamyung•1d ago•237 comments

AI-Assisted Paper on Z-Library Cites a TorrentFreak Article That Doesn't Exist

https://torrentfreak.com/ai-assisted-paper-on-z-library-cites-a-torrentfreak-article-that-doesnt-...
41•TangerineDream•1h ago•6 comments

Bringing uv and ty together

https://astral.sh/blog/uv-ty-integration
192•Ravencentric•3d ago•58 comments

Show HN: Autonomous root for Tcl Android TV via CVE-2022-22706

https://gitlab.com/c4psu13/mali-pagecache-root
11•t20n•2h ago•0 comments

A practical guide to AI image generation, from diffusion to agents

https://danielball.com/notes/ai_image_generation.html
129•westsmith•3d ago•38 comments

Dessa: Conversation Model trained only on speech

https://block.xyz/dessa
416•dsr12•17h ago•153 comments

Apple Security Research Device

https://security.apple.com/research-device/
94•neom•10h ago•42 comments

Tiling Noise – Procedural GPU Patterns

https://catlikecoding.com/godot/procedural-gpu-patterns/09-tiling-noise/
4•ibobev•3d ago•1 comments

The Chalk and the Airplane

https://unintendedconsequenc.es/chalk-and-the-airplane/
13•paulorlando•2d ago•1 comments

Hacker reverses Samsung TV, finds on-board AI listening OpenAI account suspended

https://www.reddit.com/r/antiai/comments/1xdv3e5/hacker_reverse_engineers_his_samsung_tv_and_finds/
277•testing22321•7h ago•79 comments

Canadians are running out of time to oppose Bill C-22

https://www.eff.org/deeplinks/2026/10/canadians-are-running-out-time-oppose-dangerous-c-22-survei...
437•hn_acker•1d ago•231 comments

CVE Tracker

https://cve.0xosprey.com/
184•Group_B•15h ago•69 comments

The Real Kevin Bacon

https://pudding.cool/2026/10/kevin-bacon/
328•xnx•3d ago•79 comments

C vs. C#: racing VLC's Gaussian blur

https://martinfinkel.com/blog/gaussian-blur-c-vs-csharp/
102•martz•3d ago•28 comments

The Quake Fan who built the map editor everybody uses

https://funcarena.com/articles/the-quake-fan-who-built-the-map-editor-everybody-uses
146•klaussilveira•2d ago•17 comments

How Block Blast harvests its players for ad money

https://ayoships.com/breakdowns/block-blast
66•motionlessveloc•10h ago•28 comments

One Man's Pan Am 747 Replica [video]

https://www.youtube.com/watch?v=vAFwHGGfPz4
47•Teever•15h ago•4 comments

Air Purifiers as White Noise Machines

https://www.jefftk.com/p/air-purifiers-as-white-noise-machines
147•luu•19h ago•134 comments