1

私は次のコードを得ました:

ヘッダファイル:

  #define html(...) anyHtml(__VA_ARGS__, NULL);
  const char* Html::anyHtml(const char* arg, ...);
  #define body(cssClass, ...) anyBody(cssClass, __VA_ARGS__, NULL);
  const char* Html::anyBody(const char* cssClass, const char* arg, ...);

cpp ファイル:

const char* Html::anyHtml(const char* arg, ...) {
string temp = initOpen + tagToString.at(HTML) + end + lf + lf;
va_list arguments;
for (va_start(arguments, arg); arg != NULL; arg = va_arg(arguments, const char*)) {
temp += arg + lf;
}
va_end(arguments);
temp += deOpen + tagToString.at(HTML) + end + lf;
string *returnThis = new string(temp);
return (*returnThis).c_str();
}

const char* Html::body(const char* cssClass, const char* arg, ...) {
string temp = initOpen + tagToString.at(BODY) + " class=\"" + cssClass + "\"" + end + lf + lf;
va_list arguments;
for (va_start(arguments, arg); arg != NULL; arg = va_arg(arguments, const char*)) {
temp += arg + lf +lf;
}
va_end(arguments);
temp += deOpen + tagToString.at(BODY) + end + lf;
string *returnThis = new string(temp);
return (*returnThis).c_str();
}

メインファイル:

Html *html = new Html();

cout << html -> html("test","test","test");
cout << html -> body("thisClass","test","test");

正常に動作します!!

でもこれは:

Html *html = new Html();

cout << html -> html(
    "hello",
    html -> body("thisClass","content")
    );

うまくいきません..ヘッダーファイルのanyBodyのマクロをアウトコメントすると

//#define body(cssClass, ...) anyBody(cssClass, __VA_ARGS__, NULL);

次のようにできます。

Html *html = new Html();

cout << html -> html(
    "hello",
    html -> body("thisClass","content",NULL)
    );

今私の質問:

次のようないくつかのマクロをネストすることは可能ですか

#define body(cssClass, ...) anyBody(cssClass, __VA_ARGS__, NULL);

彼らの間で?

「可変引数カウント」全体が、今日のcppではまだ実際には設計されていないことを読んだことがありますか?

関数 anyHtml() と anyBody() を見てみましょう。これはこの問題の「良い」解決策ですか、それともある種の汚い初心者ハックですか? ほとんどの場合、perl と Java と一緒に cpp を使用するのはまだ初めてです。

今..十分です:-)

言いたいことを教えてください.. :-)

- - 編集

わかった、ごめん..

Html *html = new Html();

cout << html -> html(
    "hello",
    html -> body("thisClass","content")
    );

出力は

<html>
hello
<body class="thisClass">
content
</body>
</html>

しかし、それは与えます

C2143 Syntax Error missing ')' before ';'
C2143 Syntax Error missing ')' before ';'
C2059 Syntax Error: ')'

私が両方を使用する場合

#define html(...) anyHtml(__VA_ARGS__, NULL);
#define body(cssClass, ...) anyBody(cssClass, __VA_ARGS__, NULL);

私が作れば

cout << html -> html("hello","test");
cout << html -> body("thisClass","content");

これらのエラーは表示されません..

このマクロがなければ、次のように入力する必要があります:

 cout << html -> html(
    "hello",
    html -> body("thisClass","content",NULL)
    );

私が知っている非常に特別な.. :-(

- - 編集

私の問題を解決してくれてありがとう!

マクロ定義のセミコロンは、ネストの問題を解決しました...

関数 anyHtml() と body() はどうですか...

を使用して正しいですか

string temp = ...

文字列操作の後にキャストしますか?

それとも汚れていますか?

4

2 に答える 2

1

マクロに無関係なセミコロンがあります。それらを削除します:

#define html(...) anyHtml(__VA_ARGS__, NULL)
#define body(cssClass, ...) anyBody(cssClass, __VA_ARGS__, NULL)

それらを削除しないと、展開が次のようになるため、構文エラーが発生します。

cout << html -> anyHtml(
    "hello",
    html -> anyBody("thisClass", "content", NULL);, NULL);;

編集:あなたは尋ねました:

string temp = ...を使用して文字列操作の後にキャストするのは正しいですか?それとも汚れていますか?

キャストしていませんがtemp、動的に割り当てられたメモリにそのコピーを作成しています。deleteこれにより、有効なC文字列を返すことができますが、作成したオブジェクトを呼び出すことができないため、メモリリークが発生します。

ルーチンを変更してを返すだけで、動的な割り当てを必要とせずに直接std::string戻ることができます。temp

于 2012-08-05T19:48:59.650 に答える
1

マクロ定義の後にセミコロンがあるため、引数リストにセミコロンが含まれることになります。

cout << html -> html(
  "hello",
  html -> body("thisClass","content")
  );
于 2012-08-05T19:49:22.390 に答える