Objective-Cを学ぶ〜いきなりつまずく
さて、Objective-Cだが今更C言語の基礎から学ぶ必要※も無いと思い、まずはここのチュートリアルを使わせて頂き学んでいくことにした。
Objective-C Beginner's Guide - Tristan O’Tierney
全てのコードはMingwやCygwin下で実行せず、以下のバッチファイルを使ってコンパイルしている。
gcc -o %1 %1.m -I e:/GNUstep/GNUstep/System/Library/Headers/ -L e:/GNUstep/GNUstep/System/Library/Libraries -lobjc -lgnustep-base -fconstant-string-class=NSConstantString -Wl,--enable-auto-import
ということでサンプルコードを書いてはコンパイル〜実行し「The details...」まではすいすい進み、ほうほう"Objective"としてのキーワードは@で始まるのね、ほうほうオブジェクト間のメッセージは[](ブラケット)の中に記述するのね等と進めてきたのだが、問題はすぐにやってきた。
「・Exceptions」の章この章の一連のコードをコンパイルすることができなかったのである。
In file included from CupOverflowException.h:1:0, from Cup.h:1, from Cup.m:1: e:/GNUstep/GNUstep/System/Library/Headers/Foundation/NSException.h:44:2: error: #error The current setting for native-objc-exceptions does not match that of gnustep-base ... please correct this. Cup.m: In function '-[Cup setLevel:]': Cup.m:33:9: error: '-fobjc-exceptions' is required to enable Objective-C exception syntax
ここでは2つのエラーが発生している。
一つはNSExceptionヘッダファイルのプリプロセッサ条件変数が想定されたものではなかったこと。もう一つは必要なコンパイルオプションが足りないことだ。なのでバッチファイルに二つのオプション
-D_NATIVE_OBJC_EXCEPTIONS -fobjc-exceptions
これらを追加したが、今度は以下のように別なエラーが発生してしまう。
D:\temp\cc0hSZH2.o:Cup.m:(.data+0x204): undefined reference to `__objc_class_name_CupOverflowException' D:\temp\cc0hSZH2.o:Cup.m:(.data+0x20c): undefined reference to `__objc_class_name_CupWarningException' collect2: ld returned 1 exit status
どうやら例外クラスが認識されていないようだ。この問題に1日かけて暫く調べていたのだが、"-fobjc-exceptions"オプションに関して以下の文言を読んで愕然とした。
"-fobjc-exceptions"
Enable syntactic support for structured exception handling in Objective-C, similar to what is offered by C++ and Java.
This option is required to use the Objective-C keywords @try, @throw, @catch, @finally and @synchronized.
This option is available with both the GNU runtime and the NeXT runtime (but not available in conjunction with the NeXT runtime on Mac OS X 10.2 and earlier).
Objective-C and Objective-C++ Dialect Options - Using the GNU Compiler Collection (GCC)より
"-fobjc-exceptions"
C++ と Java によって提供されるものと同様の、Objective-C で構造化された例外処理の構文のサポートを有効にします。
現在、このオプションはMac OS X 10.3 以降の NeXT ランタイムのみ、連動して利用可能です。"
On-line Manual of "gcc"より
がーん。GNUstepでは例外ブロックが使えないのか。
って、読み直してみるとチュートリアルにもちゃんと書いてあった。
NOTE: Exception handling is only supported in Mac OS X 10.3
更にがーん。
.... やはり勉強するにはMac買わなきゃだめってことか。
※私にとってC言語のキャリアは他の言語に比べて短いため、これはこれで大切なことである。