c-api.html 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. <title>Using Outcome from C code - Boost.Outcome documentation</title>
  4. <link rel="stylesheet" href="../css/boost.css" type="text/css">
  5. <meta name="generator" content="Hugo 0.52 with Boostdoc theme">
  6. <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
  7. <link rel="icon" href="../images/favicon.ico" type="image/ico"/>
  8. <body><div class="spirit-nav">
  9. <a accesskey="p" href="../experimental/outcome.html"><img src="../images/prev.png" alt="Prev"></a>
  10. <a accesskey="u" href="../experimental.html"><img src="../images/up.png" alt="Up"></a>
  11. <a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="../experimental/c-api/limitations.html"><img src="../images/next.png" alt="Next"></a></div><div id="content">
  12. <div class="titlepage"><div><div><h1 style="clear: both">Using Outcome from C code</h1></div></div></div>
  13. <p>A long standing problem for C code (or more usually nowadays, the many other programming
  14. languages which can speak the C ABI but not the C++ ABI) is how to interpret C++ exception throws. The answer
  15. is of course that they cannot, thus requiring one to write C shim code on the C++ side
  16. of things of the form:</p>
  17. <div class="highlight"><pre class="chroma"><code class="language-c++" data-lang="c++"><span class="c1">// The API we wish to expose to C
  18. </span><span class="c1"></span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="nf">get_value</span><span class="p">(</span><span class="kt">double</span> <span class="n">v</span><span class="p">);</span>
  19. <span class="c1">// The C shim function for the C++ get_value() function.
  20. </span><span class="c1"></span><span class="k">extern</span> <span class="s">&#34;C&#34;</span> <span class="kt">int</span> <span class="n">c_get_value</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">**</span><span class="n">ret</span><span class="p">,</span> <span class="kt">double</span> <span class="n">v</span><span class="p">)</span>
  21. <span class="p">{</span>
  22. <span class="k">try</span>
  23. <span class="p">{</span>
  24. <span class="o">*</span><span class="n">ret</span> <span class="o">=</span> <span class="n">get_value</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
  25. <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// success
  26. </span><span class="c1"></span> <span class="p">}</span>
  27. <span class="k">catch</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">range_error</span> <span class="o">&amp;</span><span class="p">)</span>
  28. <span class="p">{</span>
  29. <span class="k">return</span> <span class="n">ERANGE</span><span class="p">;</span>
  30. <span class="p">}</span>
  31. <span class="c1">// More catch clauses may go in here ...
  32. </span><span class="c1"></span> <span class="k">catch</span><span class="p">(...)</span>
  33. <span class="p">{</span>
  34. <span class="k">return</span> <span class="n">EAGAIN</span><span class="p">;</span>
  35. <span class="p">}</span>
  36. <span class="p">}</span>
  37. </code></pre></div>
  38. <p>This is sufficiently painful that most reach for a bindings generator tool like
  39. <a href="http://www.swig.org/">SWIG</a> to automate this sort of tedious boilerplate generation.
  40. And this is fine for larger projects, but for smaller projects the cost of
  41. setting up and configuring SWIG is also non-trivial.</p>
  42. <p>What would be really great is if <code>result&lt;T&gt;</code> returning <code>noexcept</code> C++ functions
  43. could be used straight from C. And indeed Experimental Outcome provides just that facility
  44. which this section covers next.</p>
  45. </div><p><small>Last revised: February 05, 2019 at 17:14:18 UTC</small></p>
  46. <hr>
  47. <div class="spirit-nav">
  48. <a accesskey="p" href="../experimental/outcome.html"><img src="../images/prev.png" alt="Prev"></a>
  49. <a accesskey="u" href="../experimental.html"><img src="../images/up.png" alt="Up"></a>
  50. <a accesskey="h" href="../index.html"><img src="../images/home.png" alt="Home"></a><a accesskey="n" href="../experimental/c-api/limitations.html"><img src="../images/next.png" alt="Next"></a></div></body>
  51. </html>