Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

C言語 インライン関数

インライン展開

関数にはインライン展開を指定することができます。
inlineが指定されている関数は、「インライン関数」と呼ばれ、コンパイラーは「インライン展開」を行う場合があります。

関数呼び出しコードをその場に展開する「インライン展開」

インライン展開は、関数呼び出しのコードをその場に展開する機能です。
コンパイラーは関数呼び出しのコストをなくすことができるので、コードを読みやすくしたまま、生成されるプログラムの実行速度を上げることができます。

マクロとインライン関数の違い

翻訳フェーズ - cppreference.com

マクロ関数の定義と展開はフェーズ4、インライン関数の展開はフェーズ7で行われます。

マクロ関数の展開は、概念的にテキストとしての(最高でも字句レベルでの)切り貼り操作に近いものになります。それにより、たとえば展開結果のかっこの対応のチェックや識別子のスコープチェックなどはマクロの段階では行なえません。

インライン関数の解釈や展開は、構文解析後に、言語構文を壊すことなく、つまり展開後の小0度が構文エラーをこすことなく、構文の型やチェックの元で行われます。

FreeBSDでの実装例

stand.h
/* min/max (undocumented) */
static __inline int imax(int a, int b) { return (a > b ? a : b); }
static __inline int imin(int a, int b) { return (a < b ? a : b); }
static __inline long lmax(long a, long b) { return (a > b ? a : b); }
static __inline long lmin(long a, long b) { return (a < b ? a : b); }
static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); }
static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }

参考

C初心者が知っておきたいヘッダーファイルとリンクの基礎知識 (3/4):目指せ! Cプログラマ(終) - @IT

C言語でマクロ関数とインライン関数の違いはなんですか? - Quora

keitean
初心者です。毎日勉強! @42tokyo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away