Yes, the C ABI &#x2F; calling convention is OS- and platform-specific. (Which does lead to practical problems on modern systems when you assume the ABI behaves similarly on different platforms; a good example is <a href="https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;pull&#x2F;22862" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;pull&#x2F;22862</a> , caused by 64-bit iOS treating varargs differently from OS X on x86-64 or even Linux on aarch64.)<p>However, within a given platform, the ABI tends to be small, clear, and well-documented. It&#x27;s not documented in the C language standard, but there is documentation for it, from whoever defines the platform.<p>I thought I had mentioned this in another comment, but to be clear, I&#x27;m not trying to &quot;bash C++&quot;; plenty of other type systems and standard libraries have the same issue (including Go, Rust, Python, etc.). I&#x27;m just relaying the fact that, on the platforms where Go and Rust support FFI, they do so by implementing the C ABI, which is a stable ABI defined in the platform documentation, and the C++ ABI tends not to be well-defined or stable and is also much more complex to implement. This isn&#x27;t a criticism of C++, just a fact. (And there are good things about this; for instance, C++&#x27;s type system is so much more useful than C&#x27;s.)