17

与えられた C コード

#include <stdio.h>
int x = 14; 
size_t check()
{
   struct x {};
   return sizeof(x); // which x
}
int main()
{
    printf("%zu",check()); 
    return 0;
}

私の32ビット実装ではCの出力として4を与えますが、C ++ではコード

#include <iostream>
int x = 14;    
size_t check()
{
   struct x {};
   return sizeof(x); // which x    
}
int main()
{
    std::cout<< check(); 
    return 0;
}

出力 1. なぜそのような違いがあるのですか?

4

3 に答える 3

25

C++ クラス宣言struct x {};では、名前がおよび hidesxのスコープに導入されます(以前はファイル スコープで宣言されていました)。C++ では空のクラスのサイズをゼロにすることはできないため、出力として 1 を取得します。checkxint

C では、構造体タグ名の内部スコープ宣言によって、外部スコープのオブジェクトまたは関数の名前が隠されることはありません。struct型名x(構造体) を参照するには、タグ名を使用する必要があります。ただし、構造体の構文上の制約に違反するため、C で空の構造体を使用することはできません(ただし、gcc は拡張機能としてサポートしています)。

于 2011-03-19T08:43:37.480 に答える
8

C コードはグローバル変数 'x' のサイズを示していますが、C++ コードは空の構造体のサイズを示しています。C コードで構造体 x のサイズを取得するには、sizeof(struct x) を使用します。

于 2011-03-19T08:42:59.053 に答える
7

C では、構造体タグは別の名前空間にあり、そこにある名前にアクセスするには struct キーワードを使用する必要があります。これが、"typedef struct {} x" イディオムが C で非常に人気がある理由です。これにより、基本的に構造体名をグローバル名前空間に昇格させることができます。

対照的に、C++ では、構造体 (および他のすべての名前) は、C のように個別の構造体タグの名前空間ではなく、宣言を囲む名前空間に存在します。

Saurabh が言ったように、C で sizeof(struct x) を使用するか、typedef struct {} xトリックを使用して sizeof(x) を C++ のように動作させます。

追加のボーナスとして、C++ プログラムは 1 を出力します。これは、具体的なクラス オブジェクトのサイズが 0 以外でなければならないため (オブジェクトごとに異なるアドレスが必要になるため)、コンパイラは構造体に匿名の char 値を埋め込んだためです。

于 2011-03-19T08:49:33.620 に答える