rcsidとgcc最適化

gccの-Oオプションで消えるというのを聞いたので確認してみる。
なんか、古いコンパイラしか使ってないのがバレバレ。


ソースはこんなの

static const char rcsid[] = "$Id: xxxxxxxxxxxxxxxx $";
int main(int argc,char ** argv){
        return 0;
}


各バージョンのgccで比較してみると以下のような結果。
staticで参照されてないので、いつかは省略対象になるだろうと思ってたけど
3.4系から消え始めた感じ。

gccバージョン 最適化オプション ident可否
2.95.4 O0 OK
2.95.4 O1 OK
2.95.4 O2 OK
3.2.3 O0 OK
3.2.3 O1 OK
3.2.3 O2 OK
3.4.4 O0 OK
3.4.4 O1 OK
3.4.4 O2 NG
4.1.0 O0 OK
4.1.0 O1 NG
4.1.0 O2 NG


それでもrcsidが残らないのは嬉しくないので、何か方法は無いかと思い
色々と試してみた。(*と[]は同じ結果になったので省略)

宣言 ident可否(gcc4 -O2)
static char rcsid[] NG
static const char rcsid[] NG
static volatile char rcsid[] NG
static const char __attribute__((unused)) rcsid[] NG
static const char __attribute__((used)) rcsid[] OK

色々なソース見てたら__attribute__の使い方が関数と変数で間違ってたりするのも結構あった。
gccのドキュメント見ると変数に対してはused使えないみたいだけど何故か効いた。
gcc 2.95.4だとusedなんて知らないと云われるけど。


ドキュメントに書いてないのでusedを使って良いのかという問題はあるけど
こんな感じでRCSIDをdefineして使えばそれなりに移植性あるかな。
上記オプションテストでは全部OKなのを確認。

/* Use RCSID("$Id ID String $"); */
#undef RCSID
#ifdef __GNUC__
# if __GNUC__ > 2
#  define RCSID(x) static const char __attribute__((used)) rcsid[] = x
# else /* __GNUC__ > 2 */
#  define RCSID(x) static const char rcsid[] = x
# endif /* __GNUC__ > 2 */
#else /* __GNUC__ */
# define RCSID(x) static const char rcsid[] = x
#endif /* __GNUC__ */