Cygwin + MinGW + GCC 相談室 Part 8

レス数が950を超えています。1000を超えると書き込みができなくなります。
989デフォルトの名無しさん
垢版 |
2025/12/03(水) 11:41:04.56ID:G3Cx7y7o
inline関数を使うときに
VCだと
inline int hoge(int fuga){ 中身 }
で使えるのに
mingw/gccとかだと
static inline int hoge(int fuga){ 中身 }
って描かないと使えない
なんで?
(.cに描くとか.hに描くとかそういうの無関係な話で)
2025/12/03(水) 12:52:21.06ID:yVL3HxQ8
使えるよ
リンカーエラーでも出てる?
2025/12/03(水) 12:55:52.88ID:yVL3HxQ8
あーわかった
>>989 cではなくてc++でコンパイルしな?
2025/12/03(水) 14:09:55.16ID:OnxLfrF+
>>989
C ではインライン定義は外部定義 (external definition; 要するに普通の実体ある関数) の代替を与えるというルールで、インライン定義自体は外部定義を与えない (作らない)。

呼び出しのほうは実体のある外部定義を呼び出すか代用品であるインライン定義を使うかは未規定。
インライン化用の代用品を使うかもしれないし、実体のある関数を呼び出すかもしれない。
実体のある関数を使う選択をしたときに >>989 の状況では実体のある関数は作られていないから存在しないというリンカエラーになる。
GCC でも最適化オプションを付けてインライン化されてしまったときは (インライン化されたら関数をリンクする必要がないので) エラーにならずにリンクが完了することもある。

以下のように extern 付きの宣言を付けるとインライン関数定義から外部定義の生成を強制できるのでこれで対処することも出来る。

inline void foo(void) {}
extern void foo(void);

int main(void) {
foo();
}

C++ だとインライン関数がもう少し普通の関数と扱いが平等に近づいているので分かり易いんだが……
2025/12/03(水) 22:07:45.02ID:Eh+HvnbR
らしいがこの人も勘違いしてそう
https://zenn.dev/mod_poppo/articles/c-inline-function
https://wocota.hatenadiary.org/entry/20090219/1235058524
2025/12/04(木) 05:43:42.35ID:7puO0DHP
.hの方にinlineで
.cの方にexternってことか
気持ち悪いけど納得
レスを投稿する

レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況