Objective-Cでは何故.hファイルと.mファイルを作成させられるのか
公開日:
:
最終更新日:2017/04/18
iOSアプリを書く! C言語, Objective-C, Swift, Xcode
前回説明したように、Objective-Cでプログラムを書く際には、別にC言語そのもののつもりで書いてしまっても動いてしまう。何しろObjective-Cの立ち位置はオブジェクト指向を建て増ししたCだ。C言語修得者であれば、最初の”Hello, World!”プログラムを書くのに迷う必要は全くない。
けれども、iOSアプリの入門書を見ると、まず最初にクラスベースのアプリケーションを作成しましょう。それじゃあ、.hファイルと.mファイルの中身はこうなっています!というような調子で納得しないまま置いてけぼりをくらう。何のために.hファイルと.mファイルが必要なのか。main.mだけでも、立派にプログラム動いていたじゃない!?
.hファイルにはプロトタイプ宣言をまとめているみたいな
前回挙げたCプログラムの例では、summary関数をmain関数よりも前に置いて定義している。これはC言語で関数や変数は呼び出す前に定義しておかないとエラーになるからである。呼び出す前に必ず定義。小規模なプログラムならば、このように心がけておけば問題は起きない。
けれども、たとえば関数が100個必要なプログラムがあったときに、ファイルをスクロールしていつmain関数が出てくるの?となるし、また関数同士が依存関係にある場合、関数Aに依存する関数Bに依存する関数Cが、関数Aの中に出てくると、一体順序どうすれば良いの?といったようにこんがらがり易い。
そこで、C言語の歴史の中のある一時点で、プロトタイプ宣言という仕組みが導入された。関数の処理はとりあえず置いておいて、関数が呼び出されるときのカタチをとりあえず呼び出し前に定義しておけば、処理の記述が書かれている前に呼び出しがされてもエラーにならないという仕組みだ。具体的に、前回のプログラムにプロトタイプ宣言を付けてみよう。
// main.m #import <Foundation/Foundation.h> //summary関数のプロトタイプ宣言 int summary(int x); //終了 int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... int x,sum; printf("数字を何か入力して下さい\n"); scanf("%d",&x); sum = summary(x); printf("1から%dまでの和は%dです",x,sum); } return 0; } int summary(int x){ int i,sum=0; for(i=x;i>=1;i--){ sum += i; } return sum; } |
プロトタイプ宣言の部分は、殆ど関数の呼び出しと変わらない。けれども、引数や返り値を持たない関数の場合には、引数の型の代わりにvoidを置く(void summary(void);のように)。
この宣言が呼び出しよりも前に存在していれば、実装部分はどこに書いてもよくなる。そういう便利な仕組みがプロトタイプなのだ。
となると、Objective-Cで.hファイルと.mファイルを分けさせられているというのは、こういったC言語の縛りに対応するためプロトタイプ宣言が必要であり、それをまとめて別ファイルにして読み込んでいるといった現象なのだ。
結局のところC言語(とObjective-C)はモダン言語ではない
でも、この関数定義が呼び出し前になければならないという仕様、PHPやらJavaScriptやらJavaやらで聞いたことはない。新しめの言語ではこんな問題とうに解決しているのだ。
そうしたことを踏まえて、WWDC2014でSwift言語が発表された時の文句を思い返してみてほしい。
Objective-C without the C
iOS/OSXの開発言語は、Objective-CがC言語への建て増しとして整合性を持っていなければならなかった部分をバッサリ捨てたのだ。したがって、もちろんSwiftで関数の定義順序が問題となる事はない。そして、プログラムを.hファイルと.mファイルに分ける必要もない。単一ファイル.swiftで足りるようになったのだ。
いまやSwiftの登場によってObjective-Cの息の根は止められることになったのだけれど、したがってこれからObjective-Cを学ぶ人間は安心して、生きた言語としてでなくC言語と整合性をもった化石として学習することができるようになったのである。
Swiftの登場とは、モダン言語についていけなくなっていたObjective-Cを疎んじて起こったわけではなく、むしろCとの整合性というObjective-Cの財産をこれからも保持し続けるためのAppleの決断だったのではないかとすら思う。
関連記事
-
Objective-CでiOSアプリの第二歩 とにかく立ち上がればというレベルのHello, World!アプリを作成
前回はiOSアプリ作成の第一歩として、Empty Applicationを選択した際に書いてあるコー
-
iOSプログラミング入門書では、まず最初のHello, World!すら難しい
Hello, World!が第一歩 新しくプログラミング言語を習得するときに、「この言語でのH
-
Objective-Cの第六歩 プロトコルの宣言と実装
Objective-Cの第五歩では、親クラスの継承とメソッドのオーバーライドについて説明した。そこま
-
Objective-Cの第三歩 クラスとクラスメソッドを定義する
Swiftの事をひとまず置いておいてObjective-Cの入門編を書いているわけだが、前々回の"H
-
Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する
Objective-Cの第三歩では、ピュアC言語からのObjective-Cのクラス入門ということで
-
Objective-CでiOSアプリの第一歩 新規プロジェクトで生成されるコードの解説
しけたコンソールアプリばかり作っていたけれど、ようやっとiOSプログラミングに入るとしよう。急がない
-
Xcode 6の正式リリースまでに、Objective-Cでアプリを一つ仕上げる!
Swiftに早速触れてみたい!でもXcode 6がベータ版の間は、有料(7800円/年)のDevel
-
Objective-Cの第一歩(仕切り直し)
前回Objective-Cの第一歩として挙げたコードであるが、綺麗さっぱり忘れてほしい。というのは、
-
Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド
前回Objective-Cの第四歩では、等差数列の和を計算するプログラムGaussTesterの作成
-
Objective-CでiOSアプリの第三歩 UIViewControllerの必要性を理解する
前回はUIViewControllerの存在を無視して"Hello, World!"アプリケーション