6-8 <発展> 関数呼び出し規約と前方宣言

この記事は約2分で読めます。

本トピックは発展的な内容を扱うので飛ばして構いません。一通りC言語の学習を終えてから見ることをお勧めします。

関数呼び出し規約

C言語における関数呼び出し規約とは、関数を呼び出す、または値を返却するという処理に関する決まりのことです。例えば、C言語はコンパイル時に機械語に翻訳されますが、このときに関数呼び出し時の引数のデータやreturnされた値を呼び出した側か呼び出された側のどちらが管理するかを決めます。そのため、関数呼び出し規約の変更を行っても、C言語の範囲では挙動に違いは出ません。

cdecl

intel製CPUを搭載したPCで動くC言語の処理系では、cdeclという呼び出し規約が一般的です。

この呼び出し規約では、関数を呼び出す側が引数をスタック領域に保存します。また、関数の引数は最も右の引数から順に積まれます。呼び出した側が、スタックのデータを破棄します。

stdcall

WindowsAPIではこの呼び出し規約が使用されます。スタックのデータの履きを呼び出された側が行うことを除けば、cdeclと同じです。

thicall

C++の一部の関数で用いられる呼び出し規約です。ほとんどcdeclと同じですが、thisポインタが積まれることが違います。thisポインタはC++で説明する予定です。

前方宣言

関数のプロトタイプ宣言が規格としてなかった時代は前方宣言という書き方がされていました。

返却値の型 関数名();

引数の有無に関わらず、引数部分には何も書きません。こうして、関数の存在をコンパイラに知らせていました。互換性のため、プロトタイプ宣言が利用できる現代でもこの前方宣言が利用できる場合があります。そのときは、前方宣言とプロトタイプ宣言は厳密に区別されます。そのため、引数がvoid型の関数のプロトタイプ宣言をするときに(void)と明示しないと、プロトタイプ宣言と認識されない可能性があります。よって、C言語ではプロトタイプ宣言ではvoid型であってもvoidを省略しないほうが良いでしょう。

コメント