*

Objective-Cでは何故.hファイルと.mファイルを作成させられるのか

公開日: : 最終更新日:2017/04/18 iOSアプリを書く! , , ,

前回説明したように、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の決断だったのではないかとすら思う。

関連記事

無理矢理表示したHello, World!

Objective-CでiOSアプリの第二歩 とにかく立ち上がればというレベルのHello, World!アプリを作成

前回はiOSアプリ作成の第一歩として、Empty Applicationを選択した際に書いてあるコー

記事を読む

no image

iOSプログラミング入門書では、まず最初のHello, World!すら難しい

Hello, World!が第一歩 新しくプログラミング言語を習得するときに、「この言語でのH

記事を読む

no image

Objective-Cの第六歩 プロトコルの宣言と実装

Objective-Cの第五歩では、親クラスの継承とメソッドのオーバーライドについて説明した。そこま

記事を読む

no image

Objective-Cの第三歩 クラスとクラスメソッドを定義する

Swiftの事をひとまず置いておいてObjective-Cの入門編を書いているわけだが、前々回の"H

記事を読む

GaussTester実行結果

Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する

Objective-Cの第三歩では、ピュアC言語からのObjective-Cのクラス入門ということで

記事を読む

アイコンは未指定なので不格好

Objective-CでiOSアプリの第一歩 新規プロジェクトで生成されるコードの解説

しけたコンソールアプリばかり作っていたけれど、ようやっとiOSプログラミングに入るとしよう。急がない

記事を読む

no image

Xcode 6の正式リリースまでに、Objective-Cでアプリを一つ仕上げる!

Swiftに早速触れてみたい!でもXcode 6がベータ版の間は、有料(7800円/年)のDevel

記事を読む

no image

Objective-Cの第一歩(仕切り直し)

前回Objective-Cの第一歩として挙げたコードであるが、綺麗さっぱり忘れてほしい。というのは、

記事を読む

クラスを継承して作成

Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド

前回Objective-Cの第四歩では、等差数列の和を計算するプログラムGaussTesterの作成

記事を読む

画面の回転に対応したプログラム

Objective-CでiOSアプリの第三歩 UIViewControllerの必要性を理解する

前回はUIViewControllerの存在を無視して"Hello, World!"アプリケーション

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

no image
Swiftが今年後半を目処にオープンソース化!そしてSwift 2

一時期iOSとOSXの開発からは離れていたけれど、久しぶりの大きなニュ

RunSwiftスクショ
WEB上で動作するSwiftの疑似実行環境 RunSwift・SwiftStub

Swiftの実行環境はMac+Xcode。ウワサのSwift言語に興味

no image
待望のRetina iMacが登場! iOSアプリの開発が楽になる?

10月16日(日本時間17日)に行われたAppleの新製品発表会。大方

no image
Swiftの参考書 電子書籍以外にもボツボツと登場

書店の棚に並んでいるSwift本を見て、正式リリースを実感! 何しろ

no image
Swift1.0を含むXcode6のGMが公開

大体2週間の間隔を空けてbetaのヴァージョンナンバーが上がり続けてい

→もっと見る

PAGE TOP ↑