• 締切済み

別ファイルのインライン関数コール

インライン関数について質問です。 前提条件 __inlineで関数定義 インライン関数を別ファイルのソースファイルから呼び出すには、ヘッダファイルにインライン関数の実体を置いておく必要があることは分かっています。 そのインライン関数の実態をソースファイルに置き、コンパイルオプションの組み合わせによって、別ファイルからコールすることは可能なのでしょうか?

みんなの回答

noname#208124
noname#208124
回答No.6

MS拡張の__inline使ってるのだから/GL (プログラム全体の最適化)を有効にすればいいさ

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.5

>そのインライン関数の実態をソースファイルに置き、コンパイルオプションの 組み合わせによって、別ファイルからコールすることは可能なのでしょうか? 「ソースファイルを、インクルードファイルのように使う」しか、方法はありません。 「それ以外の方法が不可能」なのは「どういう機械語コードが生成されるか?」を考えれば一目瞭然です。 インライン関数は、関数の中身が、そのまま呼んだ場所に展開されます。 インライン関数を2度呼び出すと、機械語コードは  インライン関数と無関係な命令コード  呼び出し前の命令コード  関数の中身  呼び出し後の命令コード  呼び出し前の命令コード  関数の中身  呼び出し後の命令コード  インライン関数と無関係な命令コード のように生成されます。 「関数の中身」と「呼び出し後の命令コード」の間には「呼び出し元へ帰れ」と言う命令コードは存在しません。 なので、この部分を「外部(別ファイル)から呼ぶ」のは不可能です。 関数のポインタを使用して呼ぶと、それは最早インライン関数の呼び出しではなく、通常の関数呼び出しです。インライン展開された関数は呼ばれず、実体が別の関数が呼ばれます。 無理矢理に、別ファイルでインライン展開させたいなら、 -----main.cpp----- #ifndef FUNC_INLINE #include ほげほげ #include ほげほげ (略) #endif /* FUNC_INLINE */ _inline関数の実体定義 {  中身 } #ifndef FUNC_INLINE (略) int main(int ac,char *av[]) {  中身  _inline関数の呼び出し  中身 } (略) #endif /* FUNC_INLINE */ -----sub.cpp----- #include ほげほげ #include ほげほげ #define FUNC_INLINE #include "main.cpp" /*かなり強引*/ void sub(void) {  中身  _inline関数の呼び出し  中身 } (略) と言う方法で。これなら、sub.cppでの呼び出し部分もインライン展開されます。かなり強引な方法ですけどね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ああ, もちろん関数へのポインタを使えば不可能ではないですね. インライン展開させることはさすがに無理ですが.

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

処理系によるとは思いますが、関数ポインタを介すればできるかも。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> __inlineで関数定義 そうような仕様は標準規格には存在しません。 処理系と用法を明確にしてください。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

基本的には「コンパイルするときに定義が見えてないとインラインにしようがない」ので, その「実体」のあるソースファイルをどうにかしてとりこまないとダメですね. コンパイラによっては「強制的にインクルードするファイル」を指定することもできたような気がします. もちろんあなたの使っているコンパイラでそういうことができるかどうかは知りません. そもそもあなたがどのコンパイラを使っているかわかんないし.

関連するQ&A

専門家に質問してみよう