1

同じ名前の foo を持つ 2 つの異なる構造体を宣言しました。そのうちの 1 つはグローバルに宣言されており、プログラム内の任意の関数から簡単にアクセスできます。しかし、この 2 番目の構造体が main にあり、ローカルで宣言されています。

メインで両方にアクセスする必要がありますか? 構造体変数を異なる名前で宣言することでそれを行いました。しかし、問題は構造体のサイズを確認する必要があることです...グローバル構造体ではなくローカル構造体のサイズを取得するにはどうすればよいですか?

#include <stdio.h>
#include <stdlib.h>

struct foo {
    char arr1[200];
    int x_val;
    int y_val;
    float result;
};
struct foo globe_foo;

int main()
{
    struct foo {
        char c;
        char arr[20];
        int x;
    }; 

    struct foo my_foo;
    globe_foo.x_val = 20;
    printf("Globe foo x_val: %d\n",globe_foo.x_val);
    printf("Size of struct foo is: %d\n",sizeof(struct foo));

    //how to check size of global decleared stuct foo? 
    printf("Size of struct foo is: %d\n",sizeof(struct foo));           
    system("pause"); 
    return 0;                        
}
4

2 に答える 2

2

グローバル スコープと同じ名前のブロック スコープ内の変数は、グローバル識別子を隠します

6.2.1 の ISO C9899 は次のように述べています。

識別子が同じ名前空間内の 2 つの異なるエンティティを指定する場合、スコープが重複する可能性があります。その場合、一方のエンティティのスコープ (内側のスコープ) は、他方のエンティティのスコープ (外側のスコープ) の厳密なサブセットになります。内部スコープ内では、識別子は内部スコープで宣言されたエンティティを指定します。外側のスコープで宣言されたエンティティは、内側のスコープ内では非表示になります (表示されません)。

したがってstruct foomain().

提案 : これらの型に別の名前を使用するか、別の名前の変数を使用するか、構造体型を typedef してください。

ローカル構造体foo printf("Size of struct foo is: %d\n",sizeof(struct foo));(28 または 25 依存) のみのサイズを指定します。

于 2013-03-20T05:07:07.393 に答える
1

標準Cは、ローカル宣言によって隠されている識別子(オブジェクト名またはタイプ名)を参照する方法を提供していません。

この場合、struct fooオブジェクトのサイズを使用して、グローバルのサイズを確認できますsizeof globe_foo

GCC(およびその拡張機能をサポートするコンパイラ)は、オブジェクトの型を参照する方法を提供します__typeof__globe_fooしたがって、GCCでは、 withのタイプを参照できます__typeof__(struct globe_foo)

もう1つのオプションは、グローバルタイプに。を使用してエイリアスを指定することtypedefです。ファイルスコープで宣言すると、非表示の場合でも関数内にtypedef struct foo foo_t;型が表示されます。foo_tstruct foo

サイズ(タイプの値)を印刷するときは、ではなく、を使用した指定をsize_t使用する必要があります。%zuprintf%d

于 2013-03-20T10:14:21.587 に答える