Friday, 4 April 2014

always inline

久しぶりに昔のコンパイラを Marbericks で動かしてみたら、例のごとくいろいろ動かない。__sputc duplicate symbol とか。stdio.h を見ると、

#if defined(__GNUC__) && defined(__STDC__)
__header_always_inline int __sputc(int _c, FILE *_p) {

え? __header_always_inline が inline __attribute__ ((__always_inline__)) は良いのだが、 なんで、static じゃないんだよ。

static ではないので、こいつは外から呼ばれる可能性があるので、本来は __sputc は inline であっても生成する必要があるはず。なので duplicate になっているわけね。

たぶん、どこかで always inline は生成しないってことになったのだろうけど。

Mountain Lion まではマクロだったんだよね。実際、GCC 以外ではマクロになるらしい。でも、static さえ付けてくれれば、使われてないstatic は生成しないってのがあるから問題なかったはずなんだよね。unsed static の Warning が出るのを嫌ったのかも知れないが、本末転倒な気がする。

いろいろ面倒かけるよな。もっとも、always inline ならコード生成しないのを実現すること自体は難しくはなかったんだけど。

一週間は沖縄でお留守番のようです。
Post a Comment