Predictable performance
Direct control over layout, allocation, and data representation. You decide what happens on the hot path, and the compiler stays honest.
ISO/IEC 9899:1999
Ship software with predictable performance, tight control over memory, and a stable standard. C99 adds practical language improvements without turning C into something else.
C99 is ISO/IEC 9899:1999, a widely implemented revision of the C standard.
When latency budgets matter and memory is not negotiable, C remains the language you reach for. C99 keeps the core model intact while standardizing quality-of-life improvements that make real codebases cleaner.
C99 is designed for portability and efficient execution across a wide variety of systems, from tiny embedded targets to high-throughput servers.
Direct control over layout, allocation, and data representation. You decide what happens on the hot path, and the compiler stays honest.
C99 is a formal standard with a defined library surface area. Your code travels well across compilers and operating systems.
C is the common ABI denominator. Calling into other languages, embedding runtimes, and building libraries stays straightforward.
C99 adds pragmatic language features and library headers that reduce boilerplate and improve clarity while staying close to the machine.
stdint.h and inttypes.hinline, restrict, and improved numeric supportThese examples demonstrate common C99 patterns used in production code. They are short on purpose: the goal is clarity, not cleverness.
#include <stdio.h>
struct server_config {
const char *host;
int port;
int max_clients;
};
int main(void) {
struct server_config cfg = {
.host = "127.0.0.1",
.port = 8080,
.max_clients = 128
};
printf("%s:%d (%d max)\\n", cfg.host, cfg.port, cfg.max_clients);
return 0;
}
Why this matters: naming fields during initialization guards against ordering mistakes and keeps intent obvious.
#include <stdlib.h>
#include <string.h>
struct point { double x, y, z; };
double *store_point(const struct point *p) {
double *buf = malloc(3 * sizeof(double));
if (!buf) return NULL;
memcpy(buf, p, 3 * sizeof(double));
return buf;
}
int main(void) {
double *packed = store_point(&(struct point){ .x = 1.0, .y = 0.5, .z = -0.25 });
free(packed);
return 0;
}
Why this matters: compound literals keep temporaries localized and reduce boilerplate in allocation-heavy paths.
stdint.h#include <stddef.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
uint32_t checksum(const uint8_t *data, size_t len) {
uint32_t sum = 0;
for (size_t i = 0; i < len; i++) {
sum += data[i];
}
return sum;
}
int main(void) {
uint8_t payload[] = { 0x01, 0x02, 0x03, 0xFF };
printf("sum: %" PRIu32 "\\n", checksum(payload, sizeof payload));
return 0;
}
Why this matters: fixed-width types and format macros make portable IO straightforward across compilers and targets.
Examples below are factual references to implementation languages or documented requirements, not endorsements.
SQLite describes itself as a C-language library implementing an embedded SQL database engine, and states it is the most used database engine in the world.
Redis states it is written in ANSI C and targets POSIX systems without external dependencies.
Git documentation notes that, as of Git v2.35.0, Git requires C99 (checked via __STDC_VERSION__).
nginx is widely deployed as a web server and reverse proxy; public references list its primary implementation language as C.
Tight memory budgets, deterministic execution, and direct register-level access.
High throughput, low latency, and explicit control over allocation and data layout.
Cache-aware data structures and predictable IO paths.
Build fast parsers, interpreters, and extensions with a stable C interface.
C99 refers to ISO/IEC 9899:1999, a revision of the ISO C standard published in 1999. It extends the prior C90-era standard with language and library additions while remaining largely backward compatible.
Most modern toolchains implement the majority of C99; some features have varying support levels depending on the compiler and target. If you need maximum portability, treat a few features (for example, VLAs) as optional and gate them behind build checks.
No. Many codebases choose a baseline standard for portability, then selectively adopt newer features when toolchains and targets allow.
C99 introduced a standard macro __STDC_VERSION__ value of at least 199901L for C99 support, which some projects use in their build and coding guidelines.
Use C99 as a clean baseline for portable systems code. Keep your dependencies lean, your binaries small, and your performance predictable.