2012-07-29 2 views
1

#pragma 지시문을 사용하여 코드를 작성했지만 정렬 방법을 이해할 수 없었습니다. 우분투에서 gcc를 사용하고 있습니다. #pragma pack in c를 사용했지만 이해할 수 없었습니다

#include<stdio.h> 

#define MALE 0; 
#define FEMALE 1; 
#define SINGLE 0; 
#define MARRIED 1; 
#pragma pack(3); 

int main() 
{ 
    struct emp 
    { 
     unsigned gender :1; 
     unsigned mar:1; 
     unsigned hobby:1; 
     unsigned scheme :1; 
    }; 
    struct emp e; 
    e.gender=MALE; 
    e.mar=SINGLE; 
    e.hobby=1; 
    e.scheme=1; 
    printf("size of %d",sizeof(e)); 
    return 0; 
} 

내가 1으로의 #pragma 팩을 사용

, 크기는 1 나옵니다, 2 크기의 #pragma 팩 2로 나오고, 3 것이 4

당신이 무슨 일이 일어나고 있는지 말해 줄 수 있어요 ? 만약 내가 그것을 사용하지 않으면 여전히 4가 온다.

#pragma pack(1)#pragma pack(2)의 차이점은 무엇입니까?

+0

3은'pragma pack'에 대해 유효하지 않습니다. (http://msdn.microsoft.com/en-us/library/2e70t5y1 (v = vs80) .aspx) – pmr

+0

#pragma pack (1)을 쓸 때 그 사실을 알고 싶습니다. #pragma (2)를 쓰면, 차이점은 무엇입니까? –

+0

'# define' 라인의 마지막에 세미콜론을 사용하고 싶지는 않습니다. 아마도'#pragma' 줄 끝에 세미콜론을 넣지 않기를 원할 것입니다. –

답변

2

3#pragma pack 지시어의 유효한 인수가 아닙니다.

유효한 값은 this page 예에 따른 1, 2, 4, 816이다.

0

`#pragma '지시문은 언어 자체에서 전달되는 것을 넘어서 컴파일러에 추가 정보를 제공하기 위해 C 표준에 지정된 메소드입니다.

#pragma 팩은 구조체, 공용체 및 클래스 멤버의 패킹 정렬을 지정합니다.

유효한 값은 1, 2, 4, 8 및 16입니다. 구성원의 정렬은 위에서 언급 한 값 중 여러 배나 구성원 크기의 배수 인 경계에 있습니다. 어느 쪽이든 작은 쪽.

자세한 내용은 MSDN pagehere을 참조하십시오. 또한

,

구조 포장은 무엇입니까 here에서 아래 포장 구조에 대한 약간의 정보?

때때로 구조 구성원간에 패딩 된 바이트를 피하는 것이 필수입니다. 예를 들어, ELF 파일 헤더 또는 BMP 또는 JPEG 파일 헤더의 내용을 읽습니다. 헤더 레이아웃과 비슷한 구조를 정의하고 매핑해야합니다. 그러나 그러한 회원을 접촉 할 때는주의를 기울여야한다. 일반적으로 바이트 단위로 읽는 것은 잘못 정렬 된 예외를 피하기위한 옵션입니다. 실적에 영향을 미칠 것입니다.

대부분의 컴파일러는 비표준 확장을 제공하여 pragma 또는 명령 줄 스위치와 같은 기본 패딩을 해제합니다. 자세한 내용은 해당 컴파일러의 설명서를 참조하십시오. 구조에 존재하는 데이터 미만 2 바이트 경우, 2의 #pragma를 설정할 때

i want to know that when i write #pragma pack(1) it set first bits and atart second from next one what if i write #pragma(2) , whats the difference 

는 정렬하면 동일하게 유지,이 대답합니다. 그러나 2 바이트 (예 : 4 바이트 정수) 이상인 경우 2 바이트 경계로 분할 및 정렬됩니다.

+0

#pragma pack (1)과 #pragma pack (2)의 차이점을 코드에 적용하고 대답을 검색 할 때 struct emp e의 크기가 변하기 때문에 비트 또는 바이트가 발생합니다 –

0

#pragma pack(1)#pragma pack(2)의 차이점은 첫 번째 경우에는 구조가 모든 주소에서 시작할 수 있다고합니다.

#pragma pack(2)으로 시작 주소는 2 (짝수 주소)로 나누어 져야한다고 말합니다. 컴파일러는 구조체가 크기 2 (사용하지 않은 공간으로 채움으로써)를 가지고 있다고 말함으로써 이것을 수행합니다.

emp의 배열을 만들 경우 emp a[10]과 같이 sizeof(emp)은 배열의 각 요소 사이의 거리이기도합니다. 이 때문에 컴파일러는 크기를 #pragma pack 값의 다음 배수로 반올림합니다.

관련 문제