プリプロセッサのトークン結合演算子「##」の仕様が不明

こんなことをしたい。

#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 仕様に準拠していないのではないか、と疑っている。

ただ、この本が間違っているかもしれないし、他の処理系で確認もしていないので、確実なところはわからない。

識者の方は是非コメント欄で実際はどうなのか、というところを教えていただきたいです。