8

このコードがCで1を出力するのに、C ++で他の数字を出力する理由がわかりませんか?

#include <stdio.h>
static char T = 'a';
int main(int argc, char** argv) {
    struct T { char X[2]; };
    printf("size of T is %zu\n", sizeof(T));
}

そして、なぜこのコードはCとC ++の両方で1を出力するのですか?

#include <stdio.h>
int main(int argc, char** argv) {
    static char T = 'a';
    struct T { char X[2]; };
    printf("size of T is %zu\n", sizeof(T));
}

誰かが私にこれを少し説明してもらえますか?

4

3 に答える 3

21

構造体では、だけでなくC呼び出されるためです。C ++では、のローカル定義はグローバル変数を非表示にします:struct TTstruct TT

#include <stdio.h>
static char T = 'a'; // (1)
int main(int argc, char** argv) {
    // `struct T` shadows outer `T` in C++
    struct T { char X[2]; }; // (2)

    // C: sizeof char (1); C++: sizeof struct T (2)
    printf("size of T is %u\n", sizeof(T));

    // C/C++: sizeof struct T (2)
    printf("size of struct T is %u\n", sizeof(struct T));
}

一方、両方の宣言が同じ名前付けコンテキストにある場合、C ++は、 :Tではなく構造体を実際に使用することを指定することを想定しているため、識別子のあいまいさは同じ結果になります。char T

#include <stdio.h>
int main(int argc, char** argv) {
    static char T = 'a';
    struct T { char X[2]; };
    printf("size of T is %u\n", sizeof(T)); // sizeof (char)
    printf("size of struct T is %u\n", sizeof(struct T));// sizeof struct T
}

これにより、CとC++の両方で同じサイズになります。

この間違いを避ける方法

通常、コンパイラは識別子があいまいであることを知っていますが、警告は隠されていることがよくあります。コンパイラフラグを使用して警告を表示します。GCCでは、-Wall -Wextra通常のプログラミングに最も役立ちます。

test.cc:関数内»int main(int、char **)«:
test.cc:5:43:警告:形式[-Wformat]の不明な変換記号»z«
test.cc:5:43:警告:フォーマット[-Wformat-extra-args]の多くの引数に対して
test.cc:グローバル:
test.cc:3:5:警告:未使用のパラメーター»argc«[-Wunused-parameter]
test.cc:3:5:警告:未使用のパラメーター»argv«[-Wunused-parameter]
test.cc:2:13:警告:»T«は定義されていますが、使用されていません[-Wunused-variable]

この場合、グローバルstatic char Tが定義されているが、使用されていないことがわかります。

于 2012-10-11T05:54:22.413 に答える
1

C では、構造体が宣言されると、struct <name of struct>構造体の名前だけでなく型になります。それが理由です。混乱を避けるために、人々typedefは C の宣言を単純化するために使用します

于 2012-10-11T07:53:51.033 に答える
0

他の人が述べたように、最初のスニペットでは、ローカルstruct Tはの静的変数を非表示にしますC++。ただし、何が起こっているのかを完全に理解するには、名前の曖昧性解消についても話す必要があります。2番目のコードスニペットでstruct Tは、非表示ではありませんT-それらは同じスコープにあります。

于 2012-10-11T05:58:55.957 に答える