{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-13-your-c-is-not-standard-c/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "The committee has created an unreal language that no one can or will actually use.\\\n \\- [Dennis Ritchie](https://port70.net/~nsz/c/c89/dmr-on-noalias.html) (out of context)\n\nthis is an incomplete list of some incompatibilities between c as it's written in the standard and c as it exists in the real world for people who use gcc/clang + glibc/musl.\n\n## `asm`\n\nby default, gcc and clang recognize the `asm` keyword as an extension. this is not strictly conformant, because in standard c, `asm` is a valid non-reserved identifier. so code which conforms to the standard may not compile with gcc/clang with their default settings.\n\nand like, whatever, that's fine, that's why `-std` exists, but 1. it's notable that compilers aren't conformant *by default*, and 2. why doesn't the standard just make `asm` a reserved word? c++ does that; i'm not sure why c doesn't.\n\n## `FLT_ROUNDS`\n\nthe standard specifies the `FLT_ROUNDS` macro in `float.h` as follows:\n\n5.3.5.3.3p23:\n\n> The rounding mode for floating-point addition for standard floating types is characterized by the implementation-defined value of `FLT_ROUNDS`. Evaluation of `FLT_ROUNDS` correctly reflects any execution-time change of rounding mode through the function `fesetround` in `<fenv.h>`.\n\nnotably, the standard requires that the value dynamically changes with the runtime floating environment. gcc, however, always defines `FLT_ROUNDS` to 1 (rounds to nearest), regardless of the runtime rounding mode:\n\n```\n/* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown.  */\n/* ??? This is supposed to change with calls to fesetround in <fenv.h>.  */\n#undef FLT_ROUNDS\n#define FLT_ROUNDS 1\n```\n\nclang defines a builtin for this (`__builtin_flt_rounds()`), but gcc doesn't, for some reason.\n\n## standard pragmas\n\nat some point in the future i'm gonna make an entire blog post dedicated to just this, because i kinda find it fascinating. but the super duper short version is this:\n\nthe c standard specifies five standard pragmas to control the behavior of floating point arithmetic:\n\n```\n// added in c99:\n// switch can be ON, OFF, or DEFAULT\n#pragma STDC FP_CONTACT ON\n#pragma STDC FENV_ACCESS ON\n#pragma STDC CX_LIMITED_RANGE ON\n\n// added in c23:\n// direction can be FE_DYNAMIC, FE_DOWNWARD, FE_TONEAREST,\n// FE_TONEARESTFROMZERO, FE_TOWARDZERO, FE_UPWARD, or some\n// other implementation-defined value\n#pragma STDC FENV_ROUND FE_DYNAMIC\n#pragma STDC FENV_DEC_ROUND FE_DYNAMIC\n```\n\nhowever, over 27 years after c99 was standardized, [gcc still doesn't support any of the standard pragmas](https://gcc.gnu.org/projects/c-status.html). they're just no-ops in gcc.\n\nsome (but not all) of the functionality can be replicated with command-line flags, but those operate on the entire translation unit, whereas the pragmas can apply to individual functions and blocks.\n\nclang mostly supports the c99 pragmas, but still doesn't support the c23 pragmas.\n\nthere's actually *so much* more to say about these. i *will* be writing more about them at some point, but rn i don't really have the motivation cuz it's such a big thing lol\n\n## qualifiers in function return types\n\nthe standard requires that qualifiers in function return types are discarded:\n\n> If, in the declaration \"`T D1`\", `D1` has the form\n>\n> ```\n> D ( parameter-type-listopt ) attribute-specifier-sequenceopt\n> ```\n>\n> and the type specified for *ident* in the declaration \"`T D`\" is \"*derived-declarator-type-list `T`*\", then the type specified for *ident* is \"*derived-declarator-type-list* function returning the unqualified, non-atomic version of `T`\". The optional attribute specifier appertains to the function type.\n\nbut clang treats them as significant:\n\n```\n$ cat t.c\nint f();\nconst int f();\n```\n\n```\n$ clang t.c\nt.c:2:11: error: conflicting types for 'f'\n    2 | const int f();\n      |           ^\nt.c:1:5: note: previous declaration is here\n    1 | int f();\n      |     ^\n1 error generated.\n```\n\nthe two declarations should be identical, but clang thinks they're incompatible.\n\n## outdated `va_start` definition on musl\n\nfor some reason, musl provides its own versions of some headers which the compiler already provides itself. one of these is `stdarg.h`, which is required to be supported by freestanding implementations and so is virtually guaranteed to already be provided by the compiler. but because it's provided by musl, compilers will use that header instead of the builtin one.\n\nthis is a problem because musl's header is strictly worse than the builtin header. here's how musl defines `va_start`:\n\n```\n#define va_start(v,l)   __builtin_va_start(v,l)\n```\n\nthis definition is incorrect, because c23 allows the second argument to be omitted. it should be defined like this:\n\n```\n#if __STDC_VERSION__ >= 202311L\n#define va_start(...) __builtin_c23_va_start(__VA_ARGS__)\n#else\n#define va_start(v,l) __builtin_va_start(v,l)\n#endif\n```\n\nthe result is that, when compiling for musl, c23's single-argument `va_start` can't be used, even if it's supported by the compiler.\n\n## see also\n\n- [notes on how glibc and musl handle math errors](https://sebsite.pw/w/20261004-math_errhandling.html) (`math_errhandling`)\n- [oh, apparently it's not possible to portably check for string-to-float conversion errors in standard c](https://sebsite.pw/w/20261009-strtod.html): a case where posix arguably specifies a family of functions incompatibly from standard c\n- [neither gcc nor clang are compliant with standard c++](https://sebsite.pw/w/20260708-badstdcxx.html): gcc and clang don't store language linkage information with function types in c++, contrary to what the standard requires\n- [yet another place where a linux man page is inaccurate](https://sebsite.pw/w/20261014-initstate.html) (containing a deleted section from this post!)\n",
  "authors": [
    "dverlaeckt80"
  ],
  "captured_at": "2026-10-15T14:23:03.950687001+00:00",
  "category": "news",
  "content_html": "<p>The committee has created an unreal language that no one can or will actually use.<br />\n- <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://port70.net/~nsz/c/c89/dmr-on-noalias.html\">Dennis Ritchie</a> (out of context)</p>\n<p>this is an incomplete list of some incompatibilities between c as it's written in the standard and c as it exists in the real world for people who use gcc/clang + glibc/musl.</p>\n<h2><code>asm</code></h2>\n<p>by default, gcc and clang recognize the <code>asm</code> keyword as an extension. this is not strictly conformant, because in standard c, <code>asm</code> is a valid non-reserved identifier. so code which conforms to the standard may not compile with gcc/clang with their default settings.</p>\n<p>and like, whatever, that's fine, that's why <code>-std</code> exists, but 1. it's notable that compilers aren't conformant <em>by default</em>, and 2. why doesn't the standard just make <code>asm</code> a reserved word? c++ does that; i'm not sure why c doesn't.</p>\n<h2><code>FLT_ROUNDS</code></h2>\n<p>the standard specifies the <code>FLT_ROUNDS</code> macro in <code>float.h</code> as follows:</p>\n<p>5.3.5.3.3p23:</p>\n<blockquote>\n<p>The rounding mode for floating-point addition for standard floating types is characterized by the implementation-defined value of <code>FLT_ROUNDS</code>. Evaluation of <code>FLT_ROUNDS</code> correctly reflects any execution-time change of rounding mode through the function <code>fesetround</code> in <code>&lt;fenv.h&gt;</code>.</p>\n</blockquote>\n<p>notably, the standard requires that the value dynamically changes with the runtime floating environment. gcc, however, always defines <code>FLT_ROUNDS</code> to 1 (rounds to nearest), regardless of the runtime rounding mode:</p>\n<pre><code><span class=\"code-snippet\">/* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown.  */\n/* ??? This is supposed to change with calls to fesetround in &lt;fenv.h&gt;.  */\n#undef FLT_ROUNDS\n#define FLT_ROUNDS 1\n</span></code></pre>\n<p>clang defines a builtin for this (<code>__builtin_flt_rounds()</code>), but gcc doesn't, for some reason.</p>\n<h2>standard pragmas</h2>\n<p>at some point in the future i'm gonna make an entire blog post dedicated to just this, because i kinda find it fascinating. but the super duper short version is this:</p>\n<p>the c standard specifies five standard pragmas to control the behavior of floating point arithmetic:</p>\n<pre><code><span class=\"code-snippet\">// added in c99:\n// switch can be ON, OFF, or DEFAULT\n#pragma STDC FP_CONTACT ON\n#pragma STDC FENV_ACCESS ON\n#pragma STDC CX_LIMITED_RANGE ON\n\n// added in c23:\n// direction can be FE_DYNAMIC, FE_DOWNWARD, FE_TONEAREST,\n// FE_TONEARESTFROMZERO, FE_TOWARDZERO, FE_UPWARD, or some\n// other implementation-defined value\n#pragma STDC FENV_ROUND FE_DYNAMIC\n#pragma STDC FENV_DEC_ROUND FE_DYNAMIC\n</span></code></pre>\n<p>however, over 27 years after c99 was standardized, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://gcc.gnu.org/projects/c-status.html\">gcc still doesn't support any of the standard pragmas</a>. they're just no-ops in gcc.</p>\n<p>some (but not all) of the functionality can be replicated with command-line flags, but those operate on the entire translation unit, whereas the pragmas can apply to individual functions and blocks.</p>\n<p>clang mostly supports the c99 pragmas, but still doesn't support the c23 pragmas.</p>\n<p>there's actually <em>so much</em> more to say about these. i <em>will</em> be writing more about them at some point, but rn i don't really have the motivation cuz it's such a big thing lol</p>\n<h2>qualifiers in function return types</h2>\n<p>the standard requires that qualifiers in function return types are discarded:</p>\n<blockquote>\n<p>If, in the declaration &quot;<code>T D1</code>&quot;, <code>D1</code> has the form</p>\n<pre><code><span class=\"code-snippet\">D ( parameter-type-listopt ) attribute-specifier-sequenceopt\n</span></code></pre>\n<p>and the type specified for <em>ident</em> in the declaration &quot;<code>T D</code>&quot; is &quot;<em>derived-declarator-type-list <code>T</code></em>&quot;, then the type specified for <em>ident</em> is &quot;<em>derived-declarator-type-list</em> function returning the unqualified, non-atomic version of <code>T</code>&quot;. The optional attribute specifier appertains to the function type.</p>\n</blockquote>\n<p>but clang treats them as significant:</p>\n<pre><code><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> cat t.c</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">int</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> f(</span><span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-meta syntax-post-cmd syntax-shell\">)</span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">const</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> int f(</span><span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-meta syntax-post-cmd syntax-shell\">)</span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span>\n</span></span></code></pre>\n<pre><code><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> clang t.c</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">t.c:2:11:</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> error: conflicting types for <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>f<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span></span>\n    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">2</span></span> <span class=\"syntax-keyword syntax-operator syntax-logical syntax-pipe syntax-shell\">|</span> <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">const</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> int f(</span><span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-meta syntax-post-cmd syntax-shell\">)</span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span>\n      <span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-pipe syntax-shell\">|</span>           <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">^</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">t.c:1:5:</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> note: previous declaration is here</span>\n    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">1</span></span> <span class=\"syntax-keyword syntax-operator syntax-logical syntax-pipe syntax-shell\">|</span> <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">int</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> f(</span><span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-meta syntax-post-cmd syntax-shell\">)</span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span>\n      <span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-pipe syntax-shell\">|</span>     <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">^</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">1</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> error generated.</span>\n</span></span></code></pre>\n<p>the two declarations should be identical, but clang thinks they're incompatible.</p>\n<h2>outdated <code>va_start</code> definition on musl</h2>\n<p>for some reason, musl provides its own versions of some headers which the compiler already provides itself. one of these is <code>stdarg.h</code>, which is required to be supported by freestanding implementations and so is virtually guaranteed to already be provided by the compiler. but because it's provided by musl, compilers will use that header instead of the builtin one.</p>\n<p>this is a problem because musl's header is strictly worse than the builtin header. here's how musl defines <code>va_start</code>:</p>\n<pre><code><span class=\"code-snippet\">#define va_start(v,l)   __builtin_va_start(v,l)\n</span></code></pre>\n<p>this definition is incorrect, because c23 allows the second argument to be omitted. it should be defined like this:</p>\n<pre><code><span class=\"code-snippet\">#if __STDC_VERSION__ &gt;= 202311L\n#define va_start(...) __builtin_c23_va_start(__VA_ARGS__)\n#else\n#define va_start(v,l) __builtin_va_start(v,l)\n#endif\n</span></code></pre>\n<p>the result is that, when compiling for musl, c23's single-argument <code>va_start</code> can't be used, even if it's supported by the compiler.</p>\n<h2>see also</h2>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sebsite.pw/w/20261004-math_errhandling.html\">notes on how glibc and musl handle math errors</a> (<code>math_errhandling</code>)</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sebsite.pw/w/20261009-strtod.html\">oh, apparently it's not possible to portably check for string-to-float conversion errors in standard c</a>: a case where posix arguably specifies a family of functions incompatibly from standard c</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sebsite.pw/w/20260708-badstdcxx.html\">neither gcc nor clang are compliant with standard c++</a>: gcc and clang don't store language linkage information with function types in c++, contrary to what the standard requires</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sebsite.pw/w/20261014-initstate.html\">yet another place where a linux man page is inaccurate</a> (containing a deleted section from this post!)</li>\n</ul>\n",
  "content_markdown": "The committee has created an unreal language that no one can or will actually use.\\\n \\- [Dennis Ritchie](https://port70.net/~nsz/c/c89/dmr-on-noalias.html) (out of context)\n\nthis is an incomplete list of some incompatibilities between c as it's written in the standard and c as it exists in the real world for people who use gcc/clang + glibc/musl.\n\n## `asm`\n\nby default, gcc and clang recognize the `asm` keyword as an extension. this is not strictly conformant, because in standard c, `asm` is a valid non-reserved identifier. so code which conforms to the standard may not compile with gcc/clang with their default settings.\n\nand like, whatever, that's fine, that's why `-std` exists, but 1. it's notable that compilers aren't conformant *by default*, and 2. why doesn't the standard just make `asm` a reserved word? c++ does that; i'm not sure why c doesn't.\n\n## `FLT_ROUNDS`\n\nthe standard specifies the `FLT_ROUNDS` macro in `float.h` as follows:\n\n5.3.5.3.3p23:\n\n> The rounding mode for floating-point addition for standard floating types is characterized by the implementation-defined value of `FLT_ROUNDS`. Evaluation of `FLT_ROUNDS` correctly reflects any execution-time change of rounding mode through the function `fesetround` in `<fenv.h>`.\n\nnotably, the standard requires that the value dynamically changes with the runtime floating environment. gcc, however, always defines `FLT_ROUNDS` to 1 (rounds to nearest), regardless of the runtime rounding mode:\n\n```\n/* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown.  */\n/* ??? This is supposed to change with calls to fesetround in <fenv.h>.  */\n#undef FLT_ROUNDS\n#define FLT_ROUNDS 1\n```\n\nclang defines a builtin for this (`__builtin_flt_rounds()`), but gcc doesn't, for some reason.\n\n## standard pragmas\n\nat some point in the future i'm gonna make an entire blog post dedicated to just this, because i kinda find it fascinating. but the super duper short version is this:\n\nthe c standard specifies five standard pragmas to control the behavior of floating point arithmetic:\n\n```\n// added in c99:\n// switch can be ON, OFF, or DEFAULT\n#pragma STDC FP_CONTACT ON\n#pragma STDC FENV_ACCESS ON\n#pragma STDC CX_LIMITED_RANGE ON\n\n// added in c23:\n// direction can be FE_DYNAMIC, FE_DOWNWARD, FE_TONEAREST,\n// FE_TONEARESTFROMZERO, FE_TOWARDZERO, FE_UPWARD, or some\n// other implementation-defined value\n#pragma STDC FENV_ROUND FE_DYNAMIC\n#pragma STDC FENV_DEC_ROUND FE_DYNAMIC\n```\n\nhowever, over 27 years after c99 was standardized, [gcc still doesn't support any of the standard pragmas](https://gcc.gnu.org/projects/c-status.html). they're just no-ops in gcc.\n\nsome (but not all) of the functionality can be replicated with command-line flags, but those operate on the entire translation unit, whereas the pragmas can apply to individual functions and blocks.\n\nclang mostly supports the c99 pragmas, but still doesn't support the c23 pragmas.\n\nthere's actually *so much* more to say about these. i *will* be writing more about them at some point, but rn i don't really have the motivation cuz it's such a big thing lol\n\n## qualifiers in function return types\n\nthe standard requires that qualifiers in function return types are discarded:\n\n> If, in the declaration \"`T D1`\", `D1` has the form\n>\n> ```\n> D ( parameter-type-listopt ) attribute-specifier-sequenceopt\n> ```\n>\n> and the type specified for *ident* in the declaration \"`T D`\" is \"*derived-declarator-type-list `T`*\", then the type specified for *ident* is \"*derived-declarator-type-list* function returning the unqualified, non-atomic version of `T`\". The optional attribute specifier appertains to the function type.\n\nbut clang treats them as significant:\n\n```\n$ cat t.c\nint f();\nconst int f();\n```\n\n```\n$ clang t.c\nt.c:2:11: error: conflicting types for 'f'\n    2 | const int f();\n      |           ^\nt.c:1:5: note: previous declaration is here\n    1 | int f();\n      |     ^\n1 error generated.\n```\n\nthe two declarations should be identical, but clang thinks they're incompatible.\n\n## outdated `va_start` definition on musl\n\nfor some reason, musl provides its own versions of some headers which the compiler already provides itself. one of these is `stdarg.h`, which is required to be supported by freestanding implementations and so is virtually guaranteed to already be provided by the compiler. but because it's provided by musl, compilers will use that header instead of the builtin one.\n\nthis is a problem because musl's header is strictly worse than the builtin header. here's how musl defines `va_start`:\n\n```\n#define va_start(v,l)   __builtin_va_start(v,l)\n```\n\nthis definition is incorrect, because c23 allows the second argument to be omitted. it should be defined like this:\n\n```\n#if __STDC_VERSION__ >= 202311L\n#define va_start(...) __builtin_c23_va_start(__VA_ARGS__)\n#else\n#define va_start(v,l) __builtin_va_start(v,l)\n#endif\n```\n\nthe result is that, when compiling for musl, c23's single-argument `va_start` can't be used, even if it's supported by the compiler.\n\n## see also\n\n- [notes on how glibc and musl handle math errors](https://sebsite.pw/w/20261004-math_errhandling.html) (`math_errhandling`)\n- [oh, apparently it's not possible to portably check for string-to-float conversion errors in standard c](https://sebsite.pw/w/20261009-strtod.html): a case where posix arguably specifies a family of functions incompatibly from standard c\n- [neither gcc nor clang are compliant with standard c++](https://sebsite.pw/w/20260708-badstdcxx.html): gcc and clang don't store language linkage information with function types in c++, contrary to what the standard requires\n- [yet another place where a linux man page is inaccurate](https://sebsite.pw/w/20261014-initstate.html) (containing a deleted section from this post!)\n",
  "dateCreated": "2026-10-15T14:23:03.950687001+00:00",
  "date_created": "2026-10-13T13:36:21+00:00",
  "date_modified": "2026-10-13T13:36:21+00:00",
  "date_published": "2026-10-13T13:36:21+00:00",
  "description": "The committee has created an unreal language that no one can or will actually use. - Dennis Ritchie (out of context) this is an incomplete list of some incompatibilities between c as it's written in the standard and c as it exists in the…",
  "external_url": "https://sebsite.pw/w/20261012-notstdc.html",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/hnrss-org/2026/10/2026-10-13-your-c-is-not-standard-c.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/hnrss-org/2026/10/2026-10-13-your-c-is-not-standard-c.md"
  },
  "id": "urn:aggr:item:a1bbc7e07f353e77b8f5028c1d935f6f76ebef79",
  "isBasedOn": {
    "@id": "https://sebsite.pw/w/20261012-notstdc.html"
  },
  "mainEntity": {
    "@id": "https://sebsite.pw/w/20261012-notstdc.html",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-13-your-c-is-not-standard-c/#webpage"
    },
    "author": [
      {
        "@type": "Person",
        "name": "dverlaeckt80"
      }
    ],
    "dateModified": "2026-10-13T13:36:21+00:00",
    "datePublished": "2026-10-13T13:36:21+00:00",
    "headline": "Your C is not standard C",
    "timeRequired": "PT4M",
    "url": "https://sebsite.pw/w/20261012-notstdc.html",
    "wordCount": 826
  },
  "name": "Archived snapshot: Your C is not standard C",
  "preview": null,
  "reading_minutes": 4,
  "replicated_at": null,
  "source": "hnrss-org",
  "source_name": "Hacker News: Front Page",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-10-15T14:23:03.950687001+00:00",
  "title": "Your C is not standard C",
  "url": "https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-13-your-c-is-not-standard-c/",
  "word_count": 826
}