<?xml version="1.0"?>
<rss version="2.0.">
  <channel>
    <title>Advogato blog for mpr</title>
    <link>http://www.advogato.org/person/mpr/</link>
    <description>Advogato blog for mpr</description>
    <language>en-us</language>
    <generator>mod_virgule</generator>
    <pubDate>Thu, 24 Jul 2008 19:40:20 GMT</pubDate>
    <item>
      <pubDate>Fri, 17 Sep 2004 17:17:18 GMT</pubDate>
      <title>17 Sep 2004</title>
      <link>http://www.advogato.org/person/mpr/diary.html?start=0</link>
      <guid>http://www.advogato.org/person/mpr/diary.html?start=0</guid>
      <description>You know how C++ programmers are always bragging about how
you can do things like compute factorials at run-time with
templates? Well, C++'s template system is nothing but a glorified preprocessor, and here's evidence. Try it with
something like &lt;tt&gt;gcc -w -DN=11 fact.c -o fact&lt;/tt&gt;.

&lt;p&gt; &lt;p&gt; &lt;pre&gt;
#ifndef INITIALIZED
    #define INITIALIZED
    #ifndef N
        #define N 11
    #endif
    #define A ((N)&amp;amp;1)
    #define B ((N)&amp;gt;&amp;gt;1&amp;amp;1)
    #define C ((N)&amp;gt;&amp;gt;2&amp;amp;1)
    #define D ((N)&amp;gt;&amp;gt;3&amp;amp;1)
int
main(void)
{
    printf("fact(%d) = %d", N,
    #include __FILE__
    );
}
#else /* INITIALIZED */
    (8*D + 4*C + 2*B + A)
    #if A
        #define A 0
    #else
        #define A 1
        #if B
            #define B 0
        #else
            #define B 1
            #if C
                #define C 0
            #else
                #define C 1
                #if D
                    #define D 0
                #endif
            #endif
        #endif
    #endif
    #if A || B || C || D
        *
        #include __FILE__
    #endif
#endif
&lt;/pre&gt;

&lt;p&gt; &lt;p&gt;Credit where credit is due: the idea comes from the &lt;a href="http://east.isx.com/~vanb/1995.ioccc" &gt;IOCCC entry&lt;/a&gt; that does Towers of Hanoi with the preprocessor.

&lt;p&gt; &lt;p&gt; For our next example, we'll show how you can generate code for a &lt;a href="http://oonumerics.org/blitz/examples/fft.html" &gt;256-point FFT&lt;/a&gt; with the preprocessor.

&lt;p&gt; &lt;p&gt; (&lt;i&gt;to be continued&lt;/i&gt;)</description>
    </item>
  </channel>
</rss>
