[C言語] 関数指定子 inline とは何か

5
tnozaki @tnozaki

結局-std=c99 -gの場合 inline が undefined symbol に化けるの「インライン定義を使うか外部定義を使うかは未定義動作」であって、問題ないようにも読める

2015-02-04 20:41:21
tnozaki @tnozaki

-g有り無しで挙動が違うのはまぁアレやけど

2015-02-04 20:41:37
tnozaki @tnozaki

6.7.4の例で言うと、cels関数が今回のlibobjcで問題になってるのと同じ

2015-02-04 20:52:07
tnozaki @tnozaki

celsについて他の翻訳単位に外部定義が存在しなければならなないとあって、libobjcのコードはこれに違反してるんだな

2015-02-04 20:52:37
tnozaki @tnozaki

そして、同一の翻訳単位の中ではインライン定義でも外部定義でもどっちを使ってもかまわない、gccは最適化ありだとinlineを使い最適化無しなら外部定義を使おうとする

2015-02-04 20:55:14
tnozaki @tnozaki

そんでlibobjcで問題になってるインライン関数は外部定義を用意していない、ということでgccは無罪ですな

2015-02-04 20:56:20
tnozaki @tnozaki

-gの問題ではなく-Oの問題でかつgccの振舞いはC99的になんの非もない合法という理解

2015-02-04 20:58:29
tnozaki @tnozaki

ワイは普段 static inlineでマクロ代わりにしか使わんからいまいちこの辺理解してなかった、気づき、そして成長に圧倒的感謝

2015-02-04 21:01:00
tnozaki @tnozaki

とりまこの2つの修正でDBG=-gでリリースビルドできない問題は解決 bitbucket.org/tnozaki/netbsd… bitbucket.org/tnozaki/netbsd…

2015-02-04 21:32:12
tnozaki @tnozaki

-pもつけてみるか…

2015-02-04 21:33:51
tnozaki @tnozaki

gccの自動レジスタ割り当てのバグこれ直ってるのか直ってないのかよく判らんな… gcc.gnu.org/bugzilla/show_…

2015-02-04 21:39:02
ケケモコソカメニハ @ytomino

twitter.com/tnozaki/status… twitter.com/tnozaki/status… あれ、これってextern inline時の動作ではなかったでしたっけ……。extern無しinlineにも適用されるのでしょうか

2015-02-04 21:41:59
tnozaki @tnozaki

@ytomino externありだとそのinline関数を消さずに外部定義としても残す、という理解です(間違ってるかもしれない)

2015-02-04 21:43:56
ケケモコソカメニハ @ytomino

@tnozaki 手元ではこういう結果になりました。 gist.github.com/ytomino/f83164… 何もなしは常に実体も生成、externは外部シンボルを使うか消滅、staticはローカルラベルな実体になるか消滅、でした。

2015-02-04 21:53:49
tnozaki @tnozaki

@ytomino うちでは $ nm x.o U norinl ですねぇ、ちな gcc --version 4.5.3

2015-02-04 22:02:39
ケケモコソカメニハ @ytomino

@tnozaki ……やっぱり4.9でも-std=c99の有無で動作変わります。何か勘違いしていたみたいです重ね重ねスミマセン。 修正しました:gist.github.com/ytomino/f83164…

2015-02-04 22:15:42
tnozaki @tnozaki

@ytomino どうもです、うちの結果と一致しました

2015-02-04 22:16:54
ケケモコソカメニハ @ytomino

あれですか、c99で正式に意味が与えられて、gcc拡張ではなくなったかつ意味が変わってしまったみたいな感じですか。規格読まないと……

2015-02-04 22:19:33
ケケモコソカメニハ @ytomino

おっと、そもそもinlineが正式に入ったのがc99からでした

2015-02-04 22:21:02
tnozaki @tnozaki

おそらく今のinlineの挙動って defined inline /**/ みたいにinline宣言そのもの消しても矛盾が無いようにこうなったと思われる

2015-02-04 22:34:21
ケケモコソカメニハ @ytomino

gcc.gnu.org/onlinedocs/gcc… gccのマニュアルの方には、static inlineは普通のstatic関数と同じ、static無しinlineは実体ができる、extern inlineは実体が生成されないのでマクロの代替に最適、ってちゃんと書かれてるのになー。

2015-02-04 22:36:20
鯉江 @koie

@tnozaki inlineはヒントでしかないですからね。inlineはヒントでしかないですからね。 c++ではststic扱いになってたと思います。

2015-02-04 22:38:49
tnozaki @tnozaki

@koie inlineが何するかは処理系定義ですしね

2015-02-04 22:39:31