7

C規格は、次の例を示しています。

#define hash_hash # ## #
#define mkstr(a) # a
#define in_between(a) mkstr(a)
#define join(c, d) in_between(c hash_hash d)
char p[] = join(x, y); // equivalent to char p[] = "x ## y";

ただし、「#演算子と##演算子の評価の順序は指定されていません」とも書かれています。

の展開がhash_hash、##に適用される#演算子ではなく、#に適用される##演算子として解釈されることが保証されているのはなぜですか?

4

2 に答える 2

3

「#」は、関数のようなマクロに表示され、その後にパラメーター名が続く場合にのみ演算子として機能するため...しかし、hash_hash は関数のようなマクロではなく、それらの「#」の後にパラメーター名が続きません。 .

于 2013-01-18T09:50:15.693 に答える
0

引用 C99:

句読点は、独立した構文上および意味上の重要性を持つ記号です。コンテキストに応じて、実行する操作を指定する場合があります (これにより、値または関数指定子が生成されたり、副作用が生成されたり、それらの組み合わせが生成されたりする場合があります)、その場合は演算子として知られています (他の形式の演算子も一部のコンテキストで存在します)。オペランドは、演算子が作用するエンティティです。

#および##句読点です。

その上 :

6.10.3.1 引数置換

関数のようなマクロを呼び出すための引数が識別された後、引数置換が行われます。# または ## 前処理トークンが先行するか、## 前処理トークンが後続しない限り (以下を参照)、置換リスト内のパラメーターは、そこに含まれるすべてのマクロが展開された後に、対応する引数に置き換えられます。置換される前に、各引数の前処理トークンは、前処理ファイルの残りの部分を形成しているかのように完全にマクロ置換されます。他の前処理トークンは使用できません。

于 2013-01-18T09:46:47.307 に答える