3

私はC / C ++のインライン関数について読んでいました:

http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc07cplr243.htm

次のコードの場合:

inline.h:
   #include<stdio.h>

   extern inline void two(void){  // GNU C uses this definition only for inlining
      printf("From inline.h\n");
   }

main.c:
   #include "inline.h"

   int main(void){
      void (*pTwo)() = two;
      two();
      (*pTwo)();
   }

two.c:
   #include<stdio.h>

      void two(){
      printf("In two.c\n");
   }

出力は次のようになります。

   From inline.h
   In two.c

この出力は、「インライン キーワードに gcc セマンティクスを使用する」ために取得されたものです。

バージョンの 1 つがインライン化されている場合、呼び出される two() 関数のバージョンはどのように決定されますか?

出力からわかるように、インライン バージョンは two() で呼び出され、関数ポインターなしで直接呼び出されます。一方、関数ポインタを使用すると、インライン化されていないバージョンが呼び出されます。そのような電話を解決するための一般的なルールはありますか?

4

2 に答える 2

0

はい、確かにルールがあります。実際、それはまさにあなたが提案するものです。このコンパイラ拡張機能により、1 つの関数の 2 つの定義を共存させることができ、コンパイラは、関数の呼び出しをインライン化するかどうかに応じて、使用する定義を選択します。

特に、これは最初の定義は常にインライン化され、2 番目の定義は決してインライン化されないことを意味します。したがって、特定の呼び出しサイトからどれが使用されるかは、呼び出し元の詳細のみに依存します。あなたの場合、最初の呼び出しは直接で、2 番目の呼び出しはポインターを介したものです。コンパイラは、2 番目の呼び出しではなく、最初の呼び出しをインライン化することを決定しました。これは、4 つの可能な決定のうちの 1 つです。

于 2013-06-21T07:24:03.053 に答える