0

このコードは、すべてのパラメーターが HTML_A に渡されたときに期待どおりに機能します。

#include <stdio.h>

#define HTML_A_fmt_void
#define HTML_A_arg_void
#define HTML_A_fmt_link(fmt, ...) " href=\""fmt"\""
#define HTML_A_arg_link(fmt, ...) ,__VA_ARGS__
#define HTML_A_fmt_text(fmt, ...) fmt
#define HTML_A_arg_text(fmt, ...) ,__VA_ARGS__
#define HTML_A(link, text) \
    printf("<a" HTML_A_fmt_##link ">" HTML_A_fmt_##text "</a>\n" HTML_A_arg_##link HTML_A_arg_##text)

int main(void)
{
    HTML_A(
        link("%s", "http://wwww.google.com"),
        text("%s", "Visit google")
    );
    HTML_A(
        link("%s", "http://wwww.google.com"),
        void
    );
    HTML_A(
        void,
        text("%s", "Visit google")
    );
    HTML_A(
        void,
        void
    );
    return 0;
}

しかし、フォーマットに引数なしで HTML_A を呼び出したい場合:

HTML_A(
    link("http://wwww.google.com"),
    text("Visit google")
);

gcc で次のコンパイル エラーが表示されます。

demo.c:17:1: 警告: ISO C99 では残りの引数を使用する必要があります
demo.c: 関数 'main' 内:
demo.c:17: エラー: ',' トークンの前に式が 必要です

cpp の戻り値:

printf("<a" " href=\"""http://wwww.google.com""\"" ">" "Visit google" "</a>\n" , ,);

,,最後に。

4

1 に答える 1

3

プリプロセッサが正しく機能するには、連結「演算子」(このコンテキストでは特別な意味を持つ) を使用する必要があります。

, __VA_ARGS__

書きます

, ## __VA_ARGS__

期待どおりに動作するはずです。

于 2013-01-02T14:51:17.343 に答える