参照元†
- アーキテクチャ名と関数名を連結させるマクロ。
- ____glue() の呼び出しは無駄に見えるが、__glue(a,b) a##b としてしまうと、入れ子にしたときに不都合が生じる。
#define cat(a, b) a##b
#define _xcat(a, b) a##b
#define xcat(a, b) _xcat(a, b)
int main()
{
cat(aaa,bbb); //aaabbb
//cat(cat(aaa,bbb),ccc); //Error!
xcat(aaa,bbb); //aaabbb
xcat(xcat(aaa,bbb),ccc); //aaabbbccc
return 0;
}
$ gcc -E a.c -o a.out
a.c:9:17: error: pasting ")" and "ccc" does not give a valid preprocessing token
cat(cat(aaa,bbb),ccc); //Error!
^
a.c:1:19: note: in definition of macro ‘cat’
#define cat(a, b) a##b
^
- __glue(aaa, _bbb) のように呼び出せば aaa_bbb というトークンが得られる。
- ARM の実装では _CACHE と共に使われることが多いようだ。
- linux-4.4.1/_CACHE
返り値†
#define __glue(name,fn) ____glue(name,fn)
コメント†