プリプロセッサのトークン結合演算子「##」の仕様が不明
こんなことをしたい。
#include <stdio.h> #define FOO(name) int *__##name = &##name int main(int argc, char *argv[]) { int bar; FOO(bar); printf("%x\n", __bar); return 0; }
これは cl(VC)だとコンパイルできて期待通りに動作するんだけど、gcc だとコンパイル時に以下のエラーが出てしまう。
error: pasting "&" and "bar" does not give a valid preprocessing token
"##" マクロは「トークンとトークンを結合する」ものなんだけど、gcc では "&" は有効な前処理トークンではないと怒られる。
ちなみに手元にある ANSI C 大辞典では、前処理トークンとは:
- 文字列定数
- ヘッダ名
- 識別子
- 演算子
- 前処理数
- 区切り文字
- 文字列定数
- 以上の範囲に入らないすべての空白以外の文字
ということなので、"&" は有効な前処理トークンのはず(この場合単項演算子ですし)。gcc のプリプロセッサが ANSI C 仕様に準拠していないのではないか、と疑っている。
ただ、この本が間違っているかもしれないし、他の処理系で確認もしていないので、確実なところはわからない。
識者の方は是非コメント欄で実際はどうなのか、というところを教えていただきたいです。