なかだです。

At Sat, 9 Feb 2008 11:05:17 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:33665]:
> |もう一点、BASEやBASE_FIGも実行時に求めるよりも定数にしたほうがい
> |いのではないかと思います。
> 
> ここはクロスコンパイルのことは考えなくてよかったんですっけ。

try_static_assertは、ある式がコンパイル時に真に評価されるかを調
べるものなので、クロスコンパイルでも問題ありません。もっとも、そ
の分効率はよくないのですが、ネイティブ用のと二重管理は面倒だった
ので。

もしネイティブ用と分けるなら、こんな感じになります。

require 'mkmf'

base_fig = 0
src = ("(BASE > 0) && "
       "(BASE * (BASE+1)) > BASE && "
       "(BASE * (BASE+1)) / BASE == (BASE+1)")
if CROSS_COMPILING
  while try_static_assert(src, nil, "-DBASE=10#{'0'*base_fig}UL")
    base_fig += 1
  end
else
  src = %{#{COMMON_HEADERS}
#include <stdio.h>
/*top*/
int
conftest_value()
{
    int BASE = 10, base_fig = 0;
    while (#{src}) {
        BASE *= 10;
        base_fig++;
    }
    return base_fig;
}
int main() {printf("%d\\n", conftest_value()); return 0;}
}
    if try_link0(src)
      xpopen("./conftest") do |f|
        base_fig = Integer(f.gets)
      end
    end
end
$defs << "-DBASE=1#{'0'*base_fig}UL" << "-DBASE_FIG=#{base_fig}"

create_makefile('bigdecimal')

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦