5月頭にgtk_input_dialogのソースを読んでいる時に、gtk+の他のコードを読んでたら、gtkaliasdef.cで以下のような記述に出会った。
extern __typeof (gtk_show_about_dialog) gtk_show_about_dialog \ __attribute((alias("IA__gtk_show_about_dialog"), visibility("default")));
ここで気になったのが__typeofと__attribute、これって何なんやろ。
__typeofはそのモノズバリだと引っかからなくて、typeofで調べると色々出てきた、変数の型を調べるためのgccの拡張機能(gcc some extensions)。__attribute__(こっちはあっさり)は関数に属性を設定するもの(フリーソフトウェア徹底活用講座 - C言語におけるGCCの拡張機能(2))とのこと。
んじゃ、typeofと__typeofと__typeof__って何が違うの?このうち、typeofと__typeof__はGCCのマニュアルに出てくる、それに対して__typeofは出てこない。というわけで、__typeofは推奨されていない書き方なのかなぁと推測できなくも無い。
次に、__attributeと__attribute__の違いは何ね?webでさらっと検索したところ、変数と関数に指定するときでそれぞれ指定できる属性が違ってくることは知った(フリーソフトウェア徹底活用講座C言語におけるGCCの拡張機能(3)とC言語におけるGCCの拡張機能(2))、けど二つの違いはよくわからず。[ruby-dev:27398] Re: warning: 'cdecl' attribute directive ignoredを読むと、記述される場所によってエラーになるかどうかの違いはあるみたいだ。
とりあえずどっちも記述のされ方が違うだけで実務上たいした違いは無さそうなので読む上ではもう気にしないことにしよう。
上のエントリの__attributeの中身に出てくるalias("IA__gtk_show_about_dialog")について、頭に"IA_"ってついているのは、gtk+-2.6のパフォーマンス改善の一環だそうだ。
* To reduce code size and improve efficiency, GTK+, when compiled
with the GNU toolchain, has separate internal and external entry
points for exported functions. The internal names, which begin with
IA__, may be seen when debugging a GTK+ program.
gtk+2-2.10.12 README