Togetter/min.tを安心してお使い頂くためのガイドラインを公開しました。
編集可能

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

4
tnozaki @tnozaki

N6を-gでビルドしようとするともう何年も lib/46163 のlibobjcでコケるの放置やのう

2015-02-04 00:27:22
tnozaki @tnozaki

-gつけるとinlineで宣言されてるはずのobjc_read_*などのいくつかの関数が未定義シンボルに化けてるなぁ、何これ

2015-02-04 00:48:03
tnozaki @tnozaki

全部 static inline でなく inline で宣言されてる部分か、デバッグシンボル関係でバグってんのかな

2015-02-04 00:52:28
tnozaki @tnozaki

DBG=-g かつ -std=c99の場合 1. inlineの関数定義は消える 2. しかし呼んでる箇所にinlineで展開はされない 3. よって未定義シンボルになる という動作をするらしい…

2015-02-04 01:06:47
tnozaki @tnozaki

まぁこの挙動を期待してるわけではないだろうから inline -> static inline に該当箇所書き換えてやりゃいいだけでlib/46163は片付くんだろうけど、upstream直ってんのかなこれ

2015-02-04 01:09:03
tnozaki @tnozaki

CFLAGSに-g とか -p つけるとビルド or 動かなくなるシロモンがリリース枝という

2015-02-04 01:16:20
tnozaki @tnozaki

うーんコメントみると Make sure this inline function is exported regardless of GNU89 or C99 inlining semantics as it is part of the libobjc ABI. とある

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

だから上でプロトタイプはexternで宣言して、関数定義でinlineとかアホなことやってんのか…libobjcェ…

2015-02-04 01:27:26
tnozaki @tnozaki

仕様としてどうなんだっけこれ…

2015-02-04 01:28:13
tnozaki @tnozaki

6.7.4に実例つきでOKになってるな、プロトタイプでexternあるなら外部定義は必ず作らなければならない、一方関数定義がinlineだから同じ翻訳単位での呼出はインライン展開「してもよい」だわ

2015-02-04 01:35:06
tnozaki @tnozaki

ちゅーことでgccがアカンっぽいんだがどうしたらいいンゴかねぇ…

2015-02-04 01:39:52
tnozaki @tnozaki

というか再現コード作っても再現しないな、もっと別の条件も必要ンゴかねぇ…

2015-02-04 01:48:27
tnozaki @tnozaki

archive.cの方で関数定義でinline宣言してて未定義になるのは、これプロトタイプでexternしてるわけじゃないからstatic inlineに変えてよさげ

2015-02-04 02:03:37
tnozaki @tnozaki

なのでABI的にはsendmsg.cの__objc_get_forward_imp()だけ保証してやりゃいいのか

2015-02-04 02:05:47
tnozaki @tnozaki

例のjの字が、さっきのインライン関数周りで、相変わらず間違った修正してて草生える cvsweb.netbsd.org/bsdweb.cgi/src…

2015-02-04 03:16:29
tnozaki @tnozaki

これでもいいけどね upstreamとconflictするのとinlineされなくなるだけで

2015-02-04 03:20:42
tnozaki @tnozaki

まぁarchive.cは最新のgccでは消えてるからどうでもいい

2015-02-04 03:22:31
tnozaki @tnozaki

gcc側での対応も結構行き当たりばったりやな

2015-02-04 03:50:46
tnozaki @tnozaki

対症療法だけどこれでlib/46163は解決できる bitbucket.org/tnozaki/netbsd…

2015-02-04 05:24:21
tnozaki @tnozaki

厳密にいえばABI破壊してるけど、そもそもヘッダに無い関数でstaticにし忘れただけなんで隠しても問題ないでしょ、libobjc.defにまでDLL EXPORTまでしてるのは単にWindowsわからんから適当に真似して書いただけと思われる

2015-02-04 05:26:37
tnozaki @tnozaki

どうしても厳密にABI保証したけりゃinline -> static inlineではなく、extern inlineにすればいい

2015-02-04 05:27:27
tnozaki @tnozaki

gcc4.8 でも -std=c99 -g した時の挙動は変わってないっぽい

2015-02-04 05:30:01
tnozaki @tnozaki

c99の6.7.4 inline を真面目に読んでどうするのが正しいのか調べる気力が無い

2015-02-04 05:34:00
tnozaki @tnozaki

頭悪いのでC99の6.7.4読みなおして更に混乱してきたゾ…

2015-02-04 20:37:23
残りを読む(30)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?