異なるファイルで定義された関数をインライン化すると奇妙な問題が起きています。以下のシナリオを考えてみましょう。 main.cの中GCCとインライン化C関数が他のファイルで宣言されています( "関数体が利用できません"という問題)
:inline.hで
#include "inline.h"
int main(void) {
int i = 0;
for (i = 0; i<=100000; i++) {
omfg(i);
}
return 0;
}
:
inline int omfg(unsigned int num);
とinline.cで:
#include <stdio.h>
inline int omfg(unsigned int num) {
int i = 0;
for (i = 0; i<= 10; i++) {
printf(".");
num++;
}
return num;
}
私はのようなものを使用してgccでコンパイル:
$ gcc inline.c main.c -o binary -Wall -Winline -Wextra -O2
私が取得:
main.c: In function 'main':
inline.h:2: warning: inlining failed in call to 'omfg': function body not available
main.c:7: warning: called from here
は私が間違って何をしているのですか? omfg()
を別の方法で宣言すべきですか?非常に困惑している...
私は、これはいくつかの点でかなり役に立たないコメントであると言わざるを得ない。ヘッダーファイルに何かを定義してからObjective-Cスタイルのコンパイルを行うと、関数が複数宣言されているのでエラーになります。だから...何?私は真にそのことに対する修正が本当に好奇心だと思っています。 – Namey
Objective-Cスタイルのコンパイルとは何ですか? –
関数の宣言でalways_inlineという属性しか使用できませんが、ヘッダー内の定義/本体で再宣言すると、 'omfg'の再定義が行われます。 – ItsmeJulian