Zum Hauptinhalt springen
tsecurity.de LIVE
Echtzeit-Radar & Feeds
Alle RSS Feeds
👥 Community & Social
Sichere ProgrammierungFirst-touch attribution on a cookieless static Nuxt site(21.09.2026 um 02:51 Uhr)
Sichere ProgrammierungWho Is the Customer? It Might Not Be Who Uses the Product(21.09.2026 um 02:57 Uhr)
Sichere ProgrammierungOn My Japanese Team, We Greet Each Other by Saying "You Must Be Tired"(21.09.2026 um 03:06 Uhr)
Sichere ProgrammierungRedis vs Memcached: Complete Comparison(21.09.2026 um 03:16 Uhr)
Sichere ProgrammierungHow Databricks Serverless Compute Cost My Team $14k in One Weekend(21.09.2026 um 03:20 Uhr)
Sichere ProgrammierungStop trying to make Airflow work for Medallion pipelines(21.09.2026 um 03:21 Uhr)
Sichere ProgrammierungI built an app that turns workout videos into actual workouts(21.09.2026 um 03:39 Uhr)
Sichere ProgrammierungFirst-touch attribution on a cookieless static Nuxt site(21.09.2026 um 02:51 Uhr)
Sichere ProgrammierungWho Is the Customer? It Might Not Be Who Uses the Product(21.09.2026 um 02:57 Uhr)
Sichere ProgrammierungOn My Japanese Team, We Greet Each Other by Saying "You Must Be Tired"(21.09.2026 um 03:06 Uhr)
Sichere ProgrammierungRedis vs Memcached: Complete Comparison(21.09.2026 um 03:16 Uhr)
Sichere ProgrammierungHow Databricks Serverless Compute Cost My Team $14k in One Weekend(21.09.2026 um 03:20 Uhr)
Sichere ProgrammierungStop trying to make Airflow work for Medallion pipelines(21.09.2026 um 03:21 Uhr)
Sichere ProgrammierungI built an app that turns workout videos into actual workouts(21.09.2026 um 03:39 Uhr)
Intelligence View
⚡ tsecurity.de Intelligence

A Generic min Function in C

Reagiere als Erste:r — dein Feedback zählt!

Introduction

If you’ve programmed any length of time in C, you’ve likely written a macro that returns the minimum of two values like:

#define MIN(I,J)  ((I) < (J) ? (I) : (J))

As I’ve explained in the macro article, all those parentheses should be used to ensure operator precedence as you expect. Even so, the problem of side effects occurring multiple times is still a problem:

int mf = MIN( f(), g() );  // either f or g called twice
int mn = MIN( ++i, j );    // undefined behavior

The second example above is worse because incrementing the same variable more than once in the same expression results in undefined behavior.

Functions

To eliminate side effects occurring more than once, a function can be used instead. But because C lacks templates like C++, multiple functions need to be written. At a minimum, you need:

static inline long long min_ll( long long j, long long j ) {
  return i < j ? i : j;
}

static inline unsigned long long min_ull( unsigned long long j,
                                          unsigned long long j ) {
  return i < j ? i : j;
}

static inline double min_d( double i, double j ) {
  return i < j ? i : j;
}

static inline long double min_ld( long double i, long double j ) {
  return i < j ? i : j;
}

where min_ll will handle all signed integers, min_ull will handle all unsigned integers, min_d will handle float and double, and min_ld will handle long double.

We’re going to ignore _Complex, _Decimal32, _Decimal64, and _Decimal128 types. _Complex is typically used only in specialized programs for math or physics, and the decimal types are typically used only in finance. If wanted, they’re left as trivial exercises for the reader.

You could use min_ld to handle both float and double, but long double is typically less performant than either, so casting all floating point values to long double isn’t a good idea.

These should be declared inline and put into a header (.h) file. You can get away with making them static rather than having to use extern inline in a .c file since no self-respecting C compiler will refuse to inline such trivial functions at least with optimization.

If you want to reduce the verbosity, you can use a helper macro like:

#define MIN_IMPL(T,SUFFIX) \
  static inline T min_##SUFFIX( T i, T j ) { return i < j ? i : j; }

MIN_IMPL(long long, ll)
MIN_IMPL(unsigned long long, ull)
MIN_IMPL(double, d)
MIN_IMPL(long double, ld)

#undef MIN_IMPL

_Generic

Additionally, _Generic can be used to give a veneer of function overloading so that we can simply write:

auto m = min( i, j );

and it will “just work” regardless of the types of i and j. Here’s the macro:

#define min(I,J)                  \
  _Generic( (I) + (J),            \
    int               : min_ll,   \
    long              : min_ll,   \
    long long         : min_ll,   \
    unsigned int      : min_ull,  \
    unsigned long     : min_ull,  \
    unsigned long long: min_ull,  \
    float             : min_d,    \
    double            : min_d,    \
    long double       : min_ld    \
  )( (I), (J) )

The (I) + (J) is a common trick with _Generic to use the “usual arithmetic conversions” to determine the common type when the types of I and J are not the same. (As a reminder, _Generic does not evaluate the expression just like sizeof doesn’t.) The trick also promotes smaller integral types like char and short to int (or to unsigned int if char is unsigned) so we don’t need explicit cases for those.

Some astute readers might object and ask:

Doesn’t referencing function names in the expressions cause their addresses to be taken thereby preventing the compiler from inlining calls to them because they’re now being called via pointers-to-function?

Fortunately, no. Remember that _Generic happens at compile time, so in this case, the compiler substitutes the entire _Generic expression with a direct call to the chosen inline function.

Conclusion

Using _Generic and the usual arithmetic conversions, a minimal, type-safe, undefined-behavior-safe min function can be implemented in C.

Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten A Generic min Function in C

Thematisch verwandte Begriffe: Generic, Function · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Zum Aktualisieren ziehen
ZERO-DAY CVE-2026-93974 | A flaw has been found in SourceCodester Online Reviewer Management Syste…
Advisory →
TTS Reader • tsecurity.de Voice
tsecurity.de Icon
tsecurity.de App
Offline-Lesen, Eilmeldungen & 0ms Ladezeit

Installiere tsecurity.de direkt auf deinen Home-Bildschirm für das ultimative Vollbild-Magazinerlebnis ohne Browser-Leisten.

Nächster Beitrag
Themen-Radar & Intelligence Matrix
Echtzeit-Taxonomie nach Angriffsvektoren & Plattformen

tsecurity.de Live Threat Radar

🔴 LIVE RADAR
MONITORING
AKTIV
CVE-DATENBANK
LIVE
🔍
Community Radar & Live Chat
Sentinel Bot online • Live-Stream
Dein Cluster: Security Explorer
Match:
lädt…
Verbindung zum Community-Stream wird aufgebaut...
Bearbeitungsmodus — Senden überschreibt deine Nachricht
Community-Puls — was gerade passiert
lädt…
Aktivitäten deiner Analysten
lädt…
Neues Thema oder Eilmeldung einreichen

Reiche interessante Links, Zero-Days oder Debatten ein. Die Community entscheidet per Upvote über die Veröffentlichung.

Heiß diskutierte Einreichungen
🔖 Gespeicherte Artikel
📂 Keine gespeicherten Artikel vorhanden.
Zurück Ziehen Vor
Links: vorheriger Artikel Rechts: nächster Artikel unten: schließen
News NIS-2 Frühwarnung Tier-1 Intel ⏱️ 3 Min vor 10 Min
Artikeldaten werden geladen...

Zurück: vorheriger Vor: nächster
↗ Original-Quelle
Social Reaktionen Deine Reaktion zählt
Einstufung & Relevanz-Poll 0 Stimmen
In sozialen Netzwerken teilen 1-Klick