プロフィール

kosaki

Author:kosaki
連絡先はコチラ

ブログ検索
最近の記事
最近のコメント
最近のトラックバック
リンク
カテゴリー
月別アーカイブ
RSSフィード
FC2ブログランキング

スポンサーサイト このエントリーをはてなブックマークに追加

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)

Cプリプロセッサの文字列化まじっく このエントリーをはてなブックマークに追加

PGotMoL annex さんの記事から

void _debug_printf(const char *);
#define _num_to_str(num) #num
#define num_to_str(num) _num_to_str(num)
#define debug_printf(msg) \
_debug_printf(msg " at " __FUNC__ ":" num_to_str(__LINE__))

のように、ダミーのマクロを通せばよい。

なぜこうなるのか、プリプロセッサの動作は想像するしかないが、文字列化の識別子の優先度は高いようだ。



とあるけど、gccのプリプロセッサのinfoにズバリ書いてあるで~

Macro Pitfalls: (マクロの落とし穴)
 Separate Expansion of Macro Arguments: の項

事前走査は、引数が文字列化されたり連結されたりする場合には行われない。すなわち、

#define str(s) #s
#define foo 4
str (foo)

は "foo" に展開される。再び、事前走査による意味のある影響は防がれる。

(中略)


もう一つ、事前走査が役に立つ場合がある。事前走査で引数を展開してからそれ文字列化することが、二段階のマクロを使うことで、可能になる。上に出てきた例に新しいマクロ xstr を追加しよう。

#define xstr(s) str(s)
#define str(s) #s
#define foo 4
xstr (foo)




ま、これを読んだところ、プリプロセッサマジックという印象はぬぐえんのじゃがのー




アフリカの民族衣装
理解できない呪術的! ランキング!

関連記事


プログラミング | 【2006-06-10(Sat) 15:27:11】 | Trackback:(1) | Comments:(4)
コメント

ちょっと話は変わりますが,↓の理由によって,「_debug_printf(msg " at " __FUNC__ ":" num_to_str(__LINE__))」は別の理由で通らない気がします.

These identifiers are not preprocessor macros. In GCC 3.3 and
earlier, in C only, `__FUNCTION__' and `__PRETTY_FUNCTION__' were
treated as string literals; they could be used to initialize `char'
arrays, and they could be concatenated with other string literals. GCC
3.4 and later treat them as variables, like `__func__'. In C++,
`__FUNCTION__' and `__PRETTY_FUNCTION__' have always been variables.
2006-06-10 土 07:00:38 | URL | 通りすがり #sSHoJftA [ 編集]

ほほうぅ。
なにゆえこのような変更が。
気になりますなぁ
2006-06-10 土 14:01:17 | URL | 革命の日々 #- [ 編集]

どもです。
ドキュメント読んでませんでした。お恥ずかしい。一応ANSI Cの規格書も持ってるんですけど。

で、Fedora Core 4だとGCCが4.0になっていて、__FUNCTION__が変数になったので早速マクロが使えなくて困ってます。
#で連結するのは時代遅れってことなんですかね。
2006-06-15 木 08:22:28 | URL | firewood #- [ 編集]

gcc的にはだまって可変長マクロ使えとw
そういう事ですかね
2006-06-15 木 08:30:36 | URL | 革命の日々 #- [ 編集]
Linux kernel用に自作の簡易トレーサを使っている。 http://firewood.txt-nifty.com/bbc/2005/06/u33_linux_kerne.html 1つのチェックポイントあたり、16バイトの情報を記録しておいて、あとでダンプするというもの。16バイトというのは、 u32 timestamp; // タイムスタン
【2006-06-30 Fri 11:53:01】 | PGotMoL annex
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。