2011-03-19 9 views
17

주어진 C 코드 C에있는 반면, 제 32 비트 구현에 C의 출력으로서호환성 C 및 C 사이 ++ 코드

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

준다 4 ++ 코드

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

출력 1. 왜 이러한 차이?

+1

가능한 중복 항목 : http://stackoverflow.com/questions/3451266/understanding-sizeofchar-in-32-bit-c-compilers http://stackoverflow.com/questions/119123/why-isnt-sizeof-for -a-struct-like-of-the-sum-of-each-member – phooji

+2

@phooji : 아니, 그건 중복이 아닙니다. –

+0

@Saurabh : 당신이 옳을 수도 있습니다. 질문들이 정확히 같은 땅을 덮지는 않지만, 그 답변들은 관련이 있다고 생각합니다. (Prasoon의 답변과 당신의 대답에 대한 나의 코멘트를보십시오). – phooji

답변

25

. size of empty class cannot be zero in C++이기 때문에 1이 출력됩니다.

구조체 태그 이름의 내부 범위 선언은 외부 범위의 객체 또는 함수 이름을 숨기지 않습니다. struct 태그 이름을 사용하여 x (구조체)을 참조해야합니다. 그러나 C에서 빈 구조체를 it violates the syntactical constraints on struct으로 가질 수는 없습니다 (그러나 gcc는이를 확장으로 지원합니다).

+3

+1하지만 아마도 C++에서'struct x'는 외부 범위에서'x'가 선언 되었기 때문에 변수를 숨 깁니다. 같은 범위에서 선언 되었다면 그들은 함께 행복하게 살 수있을 것이다. * sizeof의 동작은 C와 동일 할 것이다. –

7

C 코드는 전역 변수 'x'의 크기를 제공하지만 C++ 코드는 빈 구조체의 크기를 제공합니다. 는 C 코드에서 구조체의 X를 사용는 sizeof (구조체 X)의 크기를 얻으려면

C++의 클래스 선언 struct x {};check의 범위에 이름 x을 소개하고 x를 (이전에 파일 범위에서 int로 선언) 숨 깁니다에서
+0

범위 지정 문제는 맞습니다.하지만 전체적인 이야기는 아닙니다. 특히, 이제 질문이 생깁니다 : 왜 C 버전에서'sizeof (struct x)'가 0이 될까요 :) – phooji

+0

+1 속도 !! –

+0

@phooji : C의 빈 구조체가 제약 조건 위반입니다. –

0

C에서는 이름 (예 : struct x)을 직접 사용해서는 안됩니다. 해당 형식의 개체를 만들고 sizeof을 실행해야합니다.

C++에서 sizeof을 형식 이름에 적용하면 해당 형식의 개체 크기가 반환됩니다.

7

C에서는 구조체 태그가 별도의 이름 공간에 있고 구조체 키워드를 사용하여 거기에있는 이름에 액세스해야합니다. 이것은 "typedef struct {} x"관용구가 C에서 매우 인기가있는 이유입니다. 구조체 이름을 본질적으로 전역 이름 공간으로 승격시킬 수 있습니다. C++에서

는 대조적으로, 구조체 (및 다른 이름) 선언보다는 Saurabh 말했듯 C.

같이 별도의 구조체 태그 네임 스페이스를 사용를 sizeof (구조체 X)을 둘러싸는 공간에 거주 C에서, 또는 typedef struct {} x 트릭을 사용하여 sizeof (x)를 C++에서와 같이 작동 시키십시오.

추가 클래스로, 구체적인 클래스 개체의 크기가 0이 아니어야 (다른 개체의 주소가 달라야 함) 컴파일러에서 구조체를 익명 char 값으로 패딩했기 때문에 C++ 프로그램에서 1을 출력합니다.