2013年5月16日木曜日

関数の構文が分け分かんない件

例えば、MidiSend関数は次のように宣言されているのだが、


extern OSStatus
MIDISend( MIDIPortRef port, 
MIDIEndpointRef dest, 
const MIDIPacketList * pktlist ) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_4_2);


え?この構文(関数パラメータの括弧とじと文末のセミコロンの間)って何?ということで探しまわること数時間。その言わんとしている意味は何となく分かるのだが、書き方が許せないをモチベーションに、重い腰を上げてStackoverflowで検索してみると、


http://stackoverflow.com/questions/4924285/how-to-deprecate-a-method-in-xcode

にその答えが。

そのものズバリの話ではないが、この回答欄にある、deprecated用のgccの構文というところが答え。このケースでは、これを呼ぶんだとき、deprecated条件に一致すると、warningが出力される。

llvmじゃないの?と思ったが、歴史の古さからはgccだろう。

それはいいとして、そもそも例えば、

__AVAILABILITY_INTERNAL__IPHONE_6_1

のような定義がどこに定義されているのか、見つからない。__OSX_AVAILABLE_STARTINGが定義されている、"Availability.h"を見ても特に何も#includeされてないようだし。。と思ったが、よく見ると、先頭ではなく、中途半端なところに、"AvailabilityInternal.h"が#includeされていて、その中に__AVAILABILITY_INTERNAL__IPHONE_6_1などがずらずらと定義されており、

__attribute__((availability(ios,introduced=4.1,deprecated=6.1)))

のように書いてあった。

まあそれにしても、勝手にこういう構文が追加になって人が持ってたK&R読んだことがある自分にメールの1つもよこさないってどういうこと?

0 件のコメント:

コメントを投稿