GCC の __attribute__ いろいろ

NOTREACHED コメントを入れると GCC が黙るという話を読んで。

http://alohakun.blog7.fc2.com/blog-entry-429.html

えー本当ですか cpp に消されて終わりでは、 GCC のコードにもそれっぽい処理 grep できなかったし、と思って以下のようなコード。

#include <stdlib.h>
void my_exit() { exit(0); }
int main() {
    my_exit();
    /*NOTREACHED*/
}

GCC-2.95.3 から GCC-4.1 まで、全て -Wall で warning が出ました。 lint がこれで黙ったというのはそうなんだろうなぁと思うんですが。はて。まぁなんにせよ今だったら GCC の拡張、 noreturn で黙らせればいいと思いますです。

#include <stdlib.h>
__attribute__((noreturn)) void my_exit() { exit(0); }
int main() {
    my_exit();
}

__attribute__ といえば他を眺めてみると、 noinline なんてあるんですね。 C++ の volatile メンバ関数は this が volatile になるってのと inline 化抑制の二つの意味がある気がして、 inline 抑制はしたいけど this は volatile にならんでいいよ、って時があるんじゃなかろうかいや無いのかなコンパイラの気持ちがわからない…と思ってたんですが、 noinline をつければ inline だけ封印できそう。

pure も面白いと気付きました。純粋関数型の世界にようこそ。以下は -O つけるとつけないのとで最終結果は同じですが、途中の printf の回数が変化しました。

__attribute__((pure)) int twice(int i) {
    printf("%d\n", i);
    return i * i;
}

int main() {
    return twice(3) + twice(3);
}

あと Strong Using はなんか、 namespace の mixin みたいに使えるような。以下は GCC の info から。

     namespace std {
       namespace debug {
         template <class T> struct A { };
       }
       using namespace debug __attribute ((__strong__));
       template <> struct A<int> { };   // ok to specialize

       template <class T> void f (A<T>);
     }

     int main()
     {
       f (std::A<float>());             // lookup finds std::f
       f (std::A<int>());
     }

なんとなく __attribute でいいんなら __attribute__ じゃなくて今度からそっち使うか…と思い始めたんですが、そのへん使いわけとかあるんですかね…

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h