プロが教えるわが家の防犯対策術!

インライン関数について質問です。

前提条件
__inlineで関数定義

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

A 回答 (6件)

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


もちろんあなたの使っているコンパイラでそういうことができるかどうかは知りません. そもそもあなたがどのコンパイラを使っているかわかんないし.
    • good
    • 0

> __inlineで関数定義



そうような仕様は標準規格には存在しません。
処理系と用法を明確にしてください。
    • good
    • 0

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

    • good
    • 0

ああ, もちろん関数へのポインタを使えば不可能ではないですね.


インライン展開させることはさすがに無理ですが.
    • good
    • 0

>そのインライン関数の実態をソースファイルに置き、コンパイルオプションの


組み合わせによって、別ファイルからコールすることは可能なのでしょうか?

「ソースファイルを、インクルードファイルのように使う」しか、方法はありません。

「それ以外の方法が不可能」なのは「どういう機械語コードが生成されるか?」を考えれば一目瞭然です。

インライン関数は、関数の中身が、そのまま呼んだ場所に展開されます。

インライン関数を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での呼び出し部分もインライン展開されます。かなり強引な方法ですけどね。
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!