[C言語] 関数指定子 inline とは何か
結局-std=c99 -gの場合 inline が undefined symbol に化けるの「インライン定義を使うか外部定義を使うかは未定義動作」であって、問題ないようにも読める
2015-02-04 20:41:21そして、同一の翻訳単位の中ではインライン定義でも外部定義でもどっちを使ってもかまわない、gccは最適化ありだとinlineを使い最適化無しなら外部定義を使おうとする
2015-02-04 20:55:14ワイは普段 static inlineでマクロ代わりにしか使わんからいまいちこの辺理解してなかった、気づき、そして成長に圧倒的感謝
2015-02-04 21:01:00とりまこの2つの修正でDBG=-gでリリースビルドできない問題は解決 bitbucket.org/tnozaki/netbsd… bitbucket.org/tnozaki/netbsd…
2015-02-04 21:32:12gccの自動レジスタ割り当てのバグこれ直ってるのか直ってないのかよく判らんな… gcc.gnu.org/bugzilla/show_…
2015-02-04 21:39:02twitter.com/tnozaki/status… twitter.com/tnozaki/status… あれ、これってextern inline時の動作ではなかったでしたっけ……。extern無しinlineにも適用されるのでしょうか
2015-02-04 21:41:59@ytomino externありだとそのinline関数を消さずに外部定義としても残す、という理解です(間違ってるかもしれない)
2015-02-04 21:43:56@tnozaki 手元ではこういう結果になりました。 gist.github.com/ytomino/f83164… 何もなしは常に実体も生成、externは外部シンボルを使うか消滅、staticはローカルラベルな実体になるか消滅、でした。
2015-02-04 21:53:49@tnozaki ……やっぱり4.9でも-std=c99の有無で動作変わります。何か勘違いしていたみたいです重ね重ねスミマセン。 修正しました:gist.github.com/ytomino/f83164…
2015-02-04 22:15:42あれですか、c99で正式に意味が与えられて、gcc拡張ではなくなったかつ意味が変わってしまったみたいな感じですか。規格読まないと……
2015-02-04 22:19:33おそらく今のinlineの挙動って defined inline /**/ みたいにinline宣言そのもの消しても矛盾が無いようにこうなったと思われる
2015-02-04 22:34:21gcc.gnu.org/onlinedocs/gcc… gccのマニュアルの方には、static inlineは普通のstatic関数と同じ、static無しinlineは実体ができる、extern inlineは実体が生成されないのでマクロの代替に最適、ってちゃんと書かれてるのになー。
2015-02-04 22:36:20@tnozaki inlineはヒントでしかないですからね。inlineはヒントでしかないですからね。 c++ではststic扱いになってたと思います。
2015-02-04 22:38:49