Name decoration isn&#x27;t the hard part; it&#x27;s types that are hard. Remember that a simple string is a std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt;&gt;; passing a string from one place to another requires either sharing the latter two, or having a way to convey pointers to what the latter two do. And that&#x27;s not even considering things like, oh, throwing an exception whose class uses multiple inheritance and virtual methods.<p>Take a look at the Itanium C++ ABI, the de facto standard on GNU&#x2F;Linux etc. for a sense of the scale of the problem: <a href="https:&#x2F;&#x2F;mentorembedded.github.io&#x2F;cxx-abi&#x2F;abi.html" rel="nofollow">https:&#x2F;&#x2F;mentorembedded.github.io&#x2F;cxx-abi&#x2F;abi.html</a><p>And that doesn&#x27;t even standardize the layout of the actual types in std::* themselves, just the typesystem. That just gives you enough information to correctly access someone else&#x27;s implementation of std::string; you still need to have that precise implementation around at compile time. There is, however, a proposal to standardize the layout of std: <a href="https:&#x2F;&#x2F;isocpp.org&#x2F;files&#x2F;papers&#x2F;n4028.pdf" rel="nofollow">https:&#x2F;&#x2F;isocpp.org&#x2F;files&#x2F;papers&#x2F;n4028.pdf</a><p>To be fair, you have the exact same problem when trying to call <i>into</i> e.g. Rust <i>from</i> e.g. C. Rust&#x27;s typesystem is complex and its libstd is involved and not stabilized, so the easiest way is, again, to route through C types instead of trying to access Rust&#x27;s String type in C.