ダブル ハッシュは、2 つのトークンを連結するために使用されます。
#define CONCAT(a,b) a ## b
CONCAT(x, y) # Gives 'xy'
ただし、渡される引数の 1 つがマクロ自体である場合、このような素朴な実装は機能しません。
#define Z y
CONCAT(x, Z) # Gives 'xZ', not 'xy' as one might expect
そのため、質問でマクロの間接化が使用されています。
#define CONCAT(a,b) __CONCAT(a,b)
#define __CONCAT(a,b) a ## b
#define Z y
CONCAT(x, Z) # Gives 'xy'
アップデート。
次に、質問している具体的な例を考えてみましょう。
return IO_CONCAT(__IO_PREFIX,readl)(addr);
これ__IO_PREFIX
は明らかにマクロです (Linux カーネルの大文字の識別子は多くの場合マクロです)。いくつかの場所で定義されています。そのうちの1 つは次のとおりです。
#define __IO_PREFIX generic
それでは、元のステートメントを拡張するためにどの手順が実行されるかを見てみましょう。
- 展開
__IO_PREFIX
:
return IO_CONCAT(ジェネリック、readl)(addr);
- 展開
IO_CONCAT(...)
:
return _IO_CONCAT(generic,readl) (addr);
- 展開
_IO_CONCAT(...)
:
generic_readl (addr) を
返します。