1
#include <stdio.h>
#define PRINT(name) print ## name()

void printHE()
{
    printf("Hello");
}
void printWO()
{
    printf("World\n");
}


enum {
    HE,
    WO,
};

int main()
{
    PRINT(HE);
    PRINT(WO);
}

それは完全に機能しますが、なぜですか?

##とはどういう#define意味ですか?

そして、なぜHEに変換しなかったの0ですか?

4

4 に答える 4

4

あなたが尋ねていることを考えると、私はそれが次のように定義されていると##仮定していますPRINT

#define PRINT(X) print##X()

##トークン貼り付け演算子で、2 つのトークンを左右に接続して、1 つのトークンを生成します。

を記述するPRINT(HE)と、プリプロセッサprintHE()はそれを通常の関数呼び出しである に変換します。

HE は列挙型であるため、HE を 0 に変換する必要があります

それはとても良い質問です!s が解釈される前にプリプロセッサが実行されるため、変換は行われません。したがって、とがメンバーenumであるという事実は何も変更しません。HEWOenum

于 2013-09-05T14:52:16.440 に答える
0

私のコンピューターでは、正しく動作しません。以下のような印刷エラー:

two_sharp.c:(.text+0x3a): PRINT' two_sharp.c:(.text+0x46): undefined reference toPRINT への未定義の参照 'collect2: ld が 1 つの終了ステータスを返しました

于 2013-09-05T14:55:03.087 に答える