
118
7
章 関数
を持てばよい。他の翻訳単位からの関数呼び出しはインラインにコンパイルされない。
インライン関数は、機械語で呼ばれることを除けば普通の関数である。普通の関数同様
固有のアドレスを持つ。インライン関数の文でマクロが使われると、プリプロセッサは関数
が定義された場所で定義値でマクロを展開する。ただし、
static
と宣言されていないイン
ライン関数で静的記憶期間を持つ変更可能オブジェクトを定義すべきでない。
7.6
戻らない関数
すべての関数が呼び出し側に制御を戻すわけではない。戻らない関数の例には、標準
関数
abort()
,
exit()
,
_Exit()
,
quick_exit()
,
thread_exit()
などがある。これらの関数
は、目的がスレッドまたはプログラム全体の実行終了だから戻らない。戻らない関数の他
の例には標準関数
longjmp()
がある。プログラムを終了するわけではないが、事前にマクロ
setjmp
を呼び出して定義した地点からプログラムを継続実行する。
関数指定子
_Noreturn
は、C11で新しく入った。コンパイラに関数が戻らないことを伝え、
コードを最適化できるようにする。戻らない関数を呼び出すときは、帰り先アドレスを積ん
だり、CPUレジスタの内容をスタックする必要がない。コンパイラは、同じブロックで戻
らない関数呼び出しの後に他の命令があれば、「到達不能コード」警告を出すこともできる。
次の例は、戻らないユーザ定義関数を示す。
_Noreturn void myAbort() ...