2014-10-20 4 views
2

:및 GCC

#pragma pack(push,1) 
struct mystruct 
{ 
    char a1; 
    char a2; 
    int a3; 
} 
#pragma pack(pop) 

mystruct mydata() 
{ 
    mystruct ms; 
    ms.a1='a'; 
    ms.a2='b'; 
    ms.a3=12; 
    return ms; 
} 

와 MS가 1로 포장한다고 가정하지만, 오늘 누군가가 나에게 말했다 위의 정의에서, MS는 것을 팩은 정의에 영향을 미치지 않지만 선언문에는 4로 포장됩니다. http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx

내가 한 일이 맞는지 누군가가 명확하게 설명 할 수 있습니까? 이 함수의 몸체 (8.4), 그 가 통근 지정자 (7.1.1)를 포함하거나 지정하지 않고 기능을 선언하지 않는

+0

모든 정의는 선언한다. –

+0

@ n.m. 너 무슨 뜻이야? 당신은 정교 할 수 있습니까? 차이가 없다면 왜 정의와 선언이라고 부릅니까? – mans

+0

@mans 정의는 선언입니다. 모든 선언이 정의는 아닙니다.그리고 나는 당신이 인용 한 man 페이지에서 MS가 무엇을 의미 하는지를 알 수 없다. (하지만,'pack'을 사용할 이유는 전혀 생각할 수 없습니다.) –

답변

1

표준 지정 §3.1/2

선언은 정의 인 (9.2, 9.4)에서 정적 데이터 멤버를 선언하고, 클래스 이름 선언 (9.1)이며, 은 불투명 - 열거 형입니다. 선언 (7.2)에서는 템플릿 매개 변수 (14.1)이고, 함수 선언자의 매개 변수 선언 (8.3.5)이며 (7.1.3), 별칭 선언 (7.1.3), 사용 선언 (7.3.3), 정적 _ 어썰트 선언 (7 절), 함수 선언의 선언 자), 속성 선언 (7 항), 빈 선언 (7 절) 또는 사용 지시문 (7.3.4). 따라서

올바르게 언급 한 바와 같이 당신은 구조 정의를 가지고 있지만, 그것은을 위해 또한

이 적용 정의에 영향을주지 않습니다 경우 그래서 선언 아니지만 선언. 사실 MSVC 및 GCC IN/연타 올바르게과 상기 팩 (1)

struct mystruct_not_packed 
{ 
    char a1; 
    char a2; 
    int a3; 
}; 

#pragma pack(push,1) 
struct mystruct 
{ 
    char a1; 
    char a2; 
    int a3; 
}; 

mystruct_not_packed object; // This doesn't apply 
#pragma pack(pop) 

int main(int argc, char *argv[]) 
{ 
    std::cout << sizeof(mystruct) << std::endl; // 6 
    std::cout << sizeof(mystruct_not_packed) << std::endl; // 8 
    std::cout << sizeof(object) << std::endl; // 8 
} 

Example with gcc

0

어구 "은 래그이 정의에 영향을 미치지 않는다"(MSVC2013U4 테스트)은 귀하가 작성하는 경우이를 의미합니다.

struct mystruct 
{ 
    char a1; 
    char a2; 
    int a3; 
}; 

#pragma pack(push,1) 
mystruct ms; 
#pragma pack(pop) 

포장에 영향을 미치지 않습니다 ms.

그러나 예를 들어 ms은 1로 포장되며, 전체 점은 pragma pack입니다. (그 코드뿐만 아니라 coliru에 연타 및 GCC에 MSVC 2,013 출력 8 6)

Demo

+0

@ MarcoA. 그것은 동일하게 작동합니다. –

+0

@ MarcoA. 그리고 질문은 gcc를 요구합니다. –

+0

제목에 있습니다. 그것은 MSVC의 문서를 연결하지만 –