2011-06-22 12 views
3

異なるファイルで定義された関数をインライン化すると奇妙な問題が起きています。以下のシナリオを考えてみましょう。 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()を別の方法で宣言すべきですか?非常に困惑している...

答えて

2

実装をヘッダーファイルに移動します。関数を前に宣言してから定義したり、ヘッダーの下にあるinline.inlのような特殊なファイルを#includeして非表示にすることはできますが、インラインにするには基本的に関数定義を使用できる必要があります。

+0

私は、これはいくつかの点でかなり役に立たないコメントであると言わざるを得ない。ヘッダーファイルに何かを定義してからObjective-Cスタイルのコンパイルを行うと、関数が複数宣言されているのでエラーになります。だから...何?私は真にそのことに対する修正が本当に好奇心だと思っています。 – Namey

+0

Objective-Cスタイルのコンパイルとは何ですか? –

+0

関数の宣言でalways_inlineという属性しか使用できませんが、ヘッダー内の定義/本体で再宣言すると、 'omfg'の再定義が行われます。 – ItsmeJulian

2

これをコンパイルするには、インライン関数の実装をヘッダーファイルに入れる必要があります。

+2

それは唯一の方法ですか? – kmnd

+0

私はそれが最新のコンパイラに当てはまると思います。 –

関連する問題