5

Visual C++ を使用して、Cinema 4D 用のプラグインをコンパイルしています。

    GeDebugOut("-->");
    subroot = NULL;
    head = NULL;
    tail = NULL;
    success = PolygonizeHierarchy(source, hh, head, tail, &subroot, malloc);
    if (!success) {
        /* .. */
    }
    String str("not set.");
    if (subroot) {
        GeDebugOut("yes");
        str = "yes!";
        GeDebugOut("Subroot name: " + subroot->GetName());
    }
    else {
        GeDebugOut("no");
        str = "no!";
    }
    GeDebugOut("Is there a subroot?   " + str);
    GeDebugOut("<--");

予想される出力は次のとおりです。

-->
yes
Subroot name: Cube
Is there a subroot?  yes
<--

(または代わりに「いいえ」と同じです。)しかし、私は得る

-->
yes
<--


ここに 2 つの印刷物がないのはなぜですか?


の宣言ですGeDebugOut

void GeDebugOut(const CHAR* s,  ...);
void GeDebugOut(const String& s);

Stringクラスは連結可能です。+オペレーターに負担がかかります。

String(void);
String(const String& cs);
String(const UWORD* s);
String(const CHAR* cstr, STRINGENCODING type = STRINGENCODING_XBIT);
String(LONG count, UWORD fillch);
friend const String operator +(const String& Str1, const String& Str2);
const String& operator +=(const String& Str);
4

3 に答える 3

5

あなたが使用するGeDebugOutように使用する必要がありますprintf

GeDebugOut("Some message =  %s ", whatever);

ここwhateverで、はc文字列です。つまり、そのタイプはchar*です。

のオーバーロードはタイプもGeDebugOut受け入れるので、Stringユニコードを次のように使用する必要があると思います。

GeDebugOut(L"Is there a subroot?   " + str);
        // ^ note this!

の疑惑は、Unicodeが有効になっている場合、CHAR基本的wchar_tにはであり、ではないということcharです。このため、文字列リテラルは暗黙的にString型に変換されてオーバーロードに渡されないため、文字列の連結は機能しません+

于 2012-07-25T15:41:44.290 に答える
1

前述のとおり、GeDebugOutコンパイラには 2 つのバージョンから選択できます。

void GeDebugOut(const CHAR* s,  ...);
void GeDebugOut(const String& s);

遭遇したとき:

GeDebugOut("Is there a subroot?   " + str);

"Is there a subroot"type に変換される文字列リテラルconst char*です。String数値型への変換演算子があると思われます。したがって、コンパイラは最初のオーバーロードを選択しています。

+の操作は文字列連結ではなくポインター演算であるため、これは予期しない動作をもたらします。そのため、文字列リテラルのポインター合計をconst char*呼び出しており、その変換の出力が何であれ。GeDebugOutconst char*str

これを修正する方法はいくつかあります。printf別の言及として、 -like 構文に変更できます。または、次のようにStringオーバーロードを使用するように強制することもできます。

GeDebugOut(String("Is there a subroot?") + str);
于 2012-07-25T15:59:37.980 に答える
1

文字列リテラルに文字列を追加することはできません。

"Is there a subroot"は文字列リテラルであり、コンパイラはその使用をそのリテラルへのポインターとして認識します。

より良い方法は、次のようにすることです。

GeDebugOut("Is there a subroot? %s ", str);
于 2012-07-25T15:44:13.533 に答える