駆け出しエンジニアTPYの日記

文系大学生がエンジニアを目指す!

*C言語* 〜28時限目〜 関数を宣言する・・・

〜目次〜 

 

 

関数を宣言する

関数を使って大きなプログラムを作成していきます。

大きなプログラムを作成する前に、

新しい仕組みについて紹介します。

C言語では、

関数の名前と引数の数をコンパイラに知らせておく

という仕組みがあります。

これを、

関数プロトタイプ宣言(関数宣言:function declaration)

と呼びます。

関数プロトタイプ宣言は、

関数を呼び出す前に、

呼び出す関数の名前・戻り値の型・引数について、

以下のように記述します。

戻り値の型 関数名(引数リスト);

この宣言をしておくと、

関数の本体を、コードの中のどこの場所で定義していても、

間違いなく呼び出すことができます。

これまでは呼び出す前の部分で関数を定義していたが、

今度はあらかじめ関数を宣言しておき、

関数本体はmain( )関数の後に、

定義するコードを入力してみます。

sample62.c

f:id:YuyaTerayama:20180911012428p:plainーsample62の実行画面ー

1番目の数を入力してください。

7

2番目の数を入力してください。

10

最大値は10です。

sample62では、最初にmax( )関数が2つの引数をもち、

int型の戻り値を返すことを、

関数プロトタイプ宣言で示しました。

main( )関数の呼び出し方が、

戻り値や引数がプロトタイプ宣言と異なる場合には、

コンパイル時にエラーが表示される仕組みになっています。

 

ファイルを分割する

実際に関数プロトタイプ宣言が役立つのは、

大きなプログラムを作成する場合です。

大きなプログラムを作成するということをイメージしてください。

一度作成した便利な関数については、

色々なプログラムで再利用することができれば、

便利になります。

この時、何度も別のプログラムから利用するような関数は、

main( )関数と同じファイルに記述するのではなく、

別のファイルに分割して記述するのが普通です。

ファイルを分割することで、

色々なプログラムから利用しやすくなります。

実際に3つのファイルに分割してみます。

myfunc1.h

f:id:YuyaTerayama:20180911013924p:plain

myfunc1.c

f:id:YuyaTerayama:20180911013946p:plain

sample63.c

f:id:YuyaTerayama:20180911013957p:plain

ーsample63の実行画面ー

1番目の数を入力してください。

7

2番目の数を入力してください。

10

最大値は10です。

上記のコードでは、ファイルを以下の3つに分割しています。

  1. myfunc1.h・・・関数プロトタイプ宣言
  2. myfunc1.c・・・作成したmax( )関数の定義
  3. sample63.c・・・main( )関数の定義(プログラム本体)

これはsample63.cとmyfunc1.cを別々にコンパイルして、

オブジェクトファイルを作成します。

さらにオブジェクトファイル同士をリンクすることで、

1つのプログラムを作成します。

myfunc1.hファイルには、

関数の仕様をあらわす関数プロトタイプ宣言だけを記述しています。

このように関数プロトタイプ宣言をまとめたファイルのことを、

ヘッダファイル(header file)

と呼びます。

複数のファイルのコンパイル・リンクの手順については、

C言語の開発環境により異なります。

なので、対応する説明書をお読みください。

1つのプロジェクトに、

分割した複数のソースコードを追加して、

コンパイル・リンクを行ってください。

 

標準ライブラリ関数の仕組みについて

C言語の開発環境には、

どのプログラムでも使える標準的な、

処理について、

すでに定義された関数が添付されています。

これを、

標準ライブラリ関数(standard library)

と呼びます。

これまで使っていた、

printfやscanfなども、

標準ライブラリ関数に含まれる関数なのです。

例えば、入出力を行う

標準ライブラリ関数の関数プロトタイプ宣言は、

開発環境に添付されている、

stdio.hというヘッダファイルに記述されています。

これまでのコードでは、

関数プロトタイプ宣言が記述されている、

stdio.hをインクルードしていたのです。

尚、標準のヘッダファイルをインクルードするには、

< >で囲む必要があります。

一方、自分で作成したヘッダファイルをインクルードするには、

" "で囲みます。

 

ファイルを分割する際の注意

ヘッダファイルには以下の事項を宣言します。

  • 他のファイルに公開する関数プロトタイプの宣言
  • 他のファイルに公開するグローバル変数の宣言
  • 他のファイルに公開する型の宣言

上記の中の、

グローバル変数の宣言については注意があります。

ヘッダファイルでグローバル変数を宣言すると、

コード本体ファイルとの間でグローバル変数が重複するため、

エラーになります。

ファイルを分割する場合には、

変数や関数がどのファイルで適用するのかを、

考えなくてはいけません。

グローバル変数と関数の名前は全てのファイルで適用します。

ただし、staticをつけると、

ファイル内だけに限定することができます。

ヘッダファイルで公開するグローバル変数には、

externという指定をつけて宣言します。

externは変数の名前だけを他のファイルに知らせるための指定です。

 

〜END〜