2012-03-30 10 views
2

Linuxでgccを使ってC言語で開発しています。私は次のよう関数をインライン展開する

 // .H file 
     extern int my_function(int val); 

     // .C file 
     inline int my_function(int val){ 
      // my job..very short! 
     } 

に.Hと.Cファイルの私の小さな機能を整理しています

これらの関数が小さいので、インライン化することは非常に良い候補であるが、彼らがするかどうかはわかりません確かに。

私は自分のファイルを整理する方法に疑念があります。おそらく、すべての関数を.Cファイルなしの.hファイルに直接インライン展開する方が良いでしょう。 疑問を明確にするのに少し助けてくれますか?

答えて

3

まず、-finline-functionsオプションを追加することで、gccに発信者に小さな機能をインラインで試してみることができます。あなたはあなたの関数が実際にインライン化されることを何の疑いがある場合は、彼らは、あなたの関数がexterninlineの両方で宣言されているように、ここで-Winline

を使用することにより、uninlinable機能について警告するGCC

尋ねることができますは、インライン展開にのみ使用されるinlineの定義にインライン展開されます。この特定の状況では、関数はまったくコンパイルされません。

詳細はhttp://gcc.gnu.org/onlinedocs/gcc/Inline.htmlをご覧ください。

2

関数がどれほど小さくても、インライン展開するかどうかはコンパイラによって決まります。

したがって、関数の数が非常に少なく、コード内にすべてインライン展開しても、すべてがコンパイラによってインライン展開されるという保証はありません。

インラインで便利なinshgtsを見つけることができますhere

0

最初に、コンパイラは、関数をインライン化するためにその関数の定義を見ることができなければなりません。したがって、定義をヘッダーファイルに配置する必要があります。 (ここでは、アプリケーションが複数のソースファイルで構成されていると仮定しています)。注:一部の開発環境では、マルチファイルのコンパイルがサポートされています。その場合、この注釈は適用されません。

第2に、インラインC99のセマンティクスは、あなたがC++に慣れていると少し混乱します。 C99では、関数を所有する単一のソースファイル(ヘッダファイルではない)を単一にする必要があります。関数がいくつかのソースファイルでインライン化されていない場合、関数の明示的な定義が1つだけ存在する必要があります。これは、externキーワードを使用して関数を指定することによって行われます。 (これは、従来の解釈externからの逸脱であり、宣言にのみ使用されていた)。例えば

// .h file 
    inline int my_function(int val) 
    { 
     // my job..very short! 
    } 

    // In ONE .c file 
    extern int my_function(int val); 
関連する問題