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__ */