<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>mikeash.com pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html comments</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>mikeash.com Recent Comments</description><lastBuildDate>Mon, 17 Aug 2026 10:24:02 GMT</lastBuildDate><generator>PyRSS2Gen-1.0.0</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>mikeash - 2011-04-18 15:12:25</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>&lt;b&gt;Trevor:&lt;/b&gt; Yes, either that or &lt;code&gt;#if !MYTYPE_DEFINED&lt;/code&gt;. I went with the latter, but in any case it's fixed now. Thanks!</description><guid isPermaLink="true">567a5791f562de00ecd8bede24d3bf55</guid><pubDate>Mon, 18 Apr 2011 15:12:25 GMT</pubDate></item><item><title>Aidan Steele - 2011-04-17 22:21:54</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>I quite like the following macros:
&lt;br /&gt;
&lt;br /&gt;&lt;code&gt;#define likely(x)       __builtin_expect(!!(x), 1)
&lt;br /&gt;#define unlikely(x)     __builtin_expect(!!(x), 0)&lt;/code&gt;</description><guid isPermaLink="true">a82452dc5c6a8010a118dc1c27dfb6d3</guid><pubDate>Sun, 17 Apr 2011 22:21:54 GMT</pubDate></item><item><title>Trevor - 2011-04-17 20:33:05</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>&lt;code&gt;#if MYTYPE_DEFINED&lt;/code&gt;
&lt;br /&gt;
&lt;br /&gt;Shouldn't that be
&lt;br /&gt;
&lt;br /&gt;&lt;code&gt;#ifndef MYTYPE_DEFINED&lt;/code&gt;</description><guid isPermaLink="true">cc5c8fc98f21a0bde6ea65d5ab5179a2</guid><pubDate>Sun, 17 Apr 2011 20:33:05 GMT</pubDate></item><item><title>Jérôme Noël - 2011-04-16 23:52:34</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>We use a combination of Chris and Jesper macro for compile-time checks:
&lt;br /&gt;&lt;code&gt;
&lt;br /&gt;#define  lang_CHECK_CST(name, cond)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;typedef int lang_CheckCst_##name##_##__LINE__ [(cond) ? 1 : -1]
&lt;br /&gt;&lt;/code&gt;
&lt;br /&gt;It has a meaningful name but uses a typedef which avoids the declaration of externs.</description><guid isPermaLink="true">bdb0427c6cad6397332021b2959ceefa</guid><pubDate>Sat, 16 Apr 2011 23:52:34 GMT</pubDate></item><item><title>Dave Zarzycki - 2011-04-16 12:06:42</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>Here is a nice trick for making a generic assert that dynamically becomes a static assert when possible:
&lt;br /&gt;
&lt;br /&gt;#define my_assert(e)      do {    \
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (__builtin_constant_p(e)) {  \
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extern char __compile_time_assert__[(bool)(e) ? 1 : -1];       \
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {        \
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert(e);       \
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}       \
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} while (0)
&lt;br /&gt;</description><guid isPermaLink="true">a0dd59ae3191597d779578266dbc63a4</guid><pubDate>Sat, 16 Apr 2011 12:06:42 GMT</pubDate></item><item><title>Chris Suter - 2011-04-15 22:01:32</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>Here’s the macro I use:
&lt;br /&gt;
&lt;br /&gt;&lt;code&gt;#define CHECK__(line, x) typedef char check_##line##_[(x) ? 1 : -1];
&lt;br /&gt;#define CHECK_(line, x) CHECK__(line, x)
&lt;br /&gt;#define CHECK(x) CHECK_(__LINE__, (x))&lt;/code&gt;
&lt;br /&gt;</description><guid isPermaLink="true">baa514d195165c7e05464f792d4f9a2a</guid><pubDate>Fri, 15 Apr 2011 22:01:32 GMT</pubDate></item><item><title>Jesper Särnesjö - 2011-04-15 16:53:55</title><link>http://www.mikeash.com/?page=pyblog/friday-qa-2011-04-15-compile-time-tips-and-tricks.html#comments</link><description>That last tip about compile-time asserts is a good one. I like to wrap it up in macro, to save on typing and improve readability somewhat:
&lt;br /&gt;
&lt;br /&gt;&lt;code&gt;#define STATIC_ASSERT(cond, message_var_name) \
&lt;br /&gt;&amp;nbsp;&amp;nbsp;extern char static_assert_##message_var_name[(cond) ? 1 : -1]
&lt;br /&gt;
&lt;br /&gt;STATIC_ASSERT(sizeof(void *) == 8, 64_bit_pointers);
&lt;br /&gt;STATIC_ASSERT(sizeof(int) == 4, 32_bit_ints);&lt;/code&gt;</description><guid isPermaLink="true">11861a271cd4a27de42e91a7e75a80e1</guid><pubDate>Fri, 15 Apr 2011 16:53:55 GMT</pubDate></item></channel></rss>
