GCC의 __attribute__(_packed__)에 해당하는 Visual C++
일부 컴파일러의 경우 구조체에 대한 포장 지정자가 있다. 예:
RealView ARM 컴파일러의 "_패키지" 상태Gnu C 컴파일러는 "__attribute___ ((_packed___)"를 가지고 있다.Visual C++는 동등한 것이 없으며 "#pragma 팩(1)"만 있다.
나는 구조 정의에 넣을 수 있는 무언가가 필요하다.
어떤 정보/잭/제안이라도? TIA...
다음과 같이 PACK을 정의할 수 있다.GNU GCC
그리고MSVC
:
#ifdef __GNUC__
#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
#endif
#ifdef _MSC_VER
#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop))
#endif
그리고 다음과 같이 사용하라.
PACK(struct myStruct
{
int a;
int b;
});
능글맞은 방법은 모르겠지만 이런 끔찍한 짓을 할 수도 있을 거야
#include "packed.h"
struct Foo { /* members go here */ } PACKED;
#include "endpacked.h"
그럼 MSVC는 포장된 겁니다.h:
#define PACKED
#pragma pack(push,1)
포장이 된
#pragma pack(pop)
#undef PACKED
gcc용, 포장.h:
#define PACKED __attribute__ ((__packed__))
포장이 된h:
#undef PACKED
기본적으로 패킹은 플랫폼에 너무 의존적이다.포장된 구조체에 8비트 필드가 있다고 가정하고 16비트 바이트의 일부 시스템을 고려하십시오.패킹만으로 데이터를 나타내는 구조를 가질 수는 없다. 두 시스템 간에 전송할 때 8비트 바이트가 16비트 바이트로 변환되는 방법을 알아야 한다.16비트 시스템의 구조는 비트 필드가 필요할 수 있으며, 이 경우 구현 방법을 알아야 한다.
따라서 코드가 일반적으로 휴대할 수 있도록 의도된 경우, 헤더 파일의 플랫폼별 섹션에서 필요한 포장된 구조를 정의해야 할 수 있다.그렇지 않으면 미래의 포트가 그렇게 할 수 있도록 코드를 구성하십시오.
나는 이 질문이 이제 오래되었다는 것을 알지만, 나는 이전에 게시된 것보다 더 좋은 해결책이 있다고 믿는다.MSVC 사례에 실용마를 넣는 것은 결국 구조 선언 라인에 넣을 수 있다.다음을 고려하십시오.
#ifdef _MSC_VER
# define PACKED_STRUCT(name) \
__pragma(pack(push, 1)) struct name __pragma(pack(pop))
#elif defined(__GNUC__)
# define PACKED_STRUCT(name) struct __attribute__((packed)) name
#endif
그러면 다음과 같이 사용할 수 있다.
typedef PACKED_STRUCT() { short a; int b } my_struct_t;
PACKED_STRUCT(my_other_struct) { short a; int b };
등
여기서 핵심은 __pragma의 사용은 구조체의 신고선 주위에만 있으면 된다는 것이다.여기에는 구조체 이름이 주어진 경우 구조체 이름이 포함되어야 하므로, 이름이 매크로의 매개 변수가 된다.물론 이것은 열거형/수업까지 확장하기 쉬우니, 독자에게 연습으로 남겨두겠다!
팩 설명서 MSDN 페이지의 테스트 프로그램은 이를 검증하는 데 유용하다.
편집
테스트 결과 Windows에서 Intel 컴파일러를 사용하던 중이었습니다.icl.exe를 사용하면 문제 없이 작동하지만 마이크로소프트 컴파일러(cl.exe)에서는 작동하지 않는다(2010년 및 2013년 테스트).
GCC는 VC++팩 관련 실용마스를 지원하므로 반대로 할 수 있다.자세한 내용은 여기를 참조하십시오.
추출...
Microsoft Windows 컴파일러와의 호환성을 위해 GCC는 일련의
#pragma
이후 정의된 구조(영폭 비트필드 제외), 유니언 및 클래스의 구성원의 최대 정렬을 변경하는 지침.아래 n 값은 항상 2의 작은 검정력이어야 하며 새로운 정렬을 바이트 단위로 지정한다.
#pragma pack(n)
새 정렬을 간단히 설정한다.
#pragma pack()
컴파일이 시작될 때 적용되는 정렬로 설정(명령줄 옵션 참조)-fpack-struct[=<n>]
코드 생성 옵션)을 참조하십시오.
#pragma pack(push[,n])
내부 스택에서 현재 정렬 설정을 누른 다음 선택적으로 새 정렬을 설정하십시오.
#pragma pack(pop)
정렬 설정을 내부 스택의 맨 위에 저장된 설정으로 복원(그리고 해당 스택 항목을 제거).참고:
#pragma pack([n])
이 내부 스택에 영향을 미치지 않으므로, 이 스택을 가질 수 있다.#pragma pack(push)
뒤이어 복수하다.#pragma pack(n)
단일 항목으로 마무리된 인스턴스#pragma pack(pop)
.i386과 powerpc와 같은 일부 타겟은
ms_struct
#pragma
문서화된 구조물에 따르면__attribute__((ms_struct))
.
#pragma ms_struct on
선언된 구조물의 레이아웃을 켜십시오.
#pragma ms_struct off
선언된 구조물의 레이아웃을 끄십시오.
#pragma ms_struct reset
기본 레이아웃으로 돌아가십시오.
지원해야 하는 컴파일러에 따라 다른 해결책은 GCC가 최소한 버전 4.0.4 이후 마이크로소프트 스타일의 포장 실용파를 지원해왔다는 점에 주목하는 것이다(3.4.6 및 4.0.4의 경우 온라인 설명서가 gnu.org에서 제공됨 - 실용화는 전자에 설명되어 있지 않고 후자에 있음).이렇게 하면#pragma pack(push,1)
구조 정의 전에#pragma pack(pop)
정의 후에 둘 중 하나로 컴파일될 것이다.
왜 구조물에 들어갈 뭔가가 필요한 거야?
생각합니다#pragma pack(1)
같은 거야, 아니면 내가 뭘 놓친 거야?
다음 작업을 수행하십시오.
struct Foo
{
#pragma pack(push, 1)
int Bar;
#pragma pack(pop)
};
그런데 보기 흉하다.
참조URL: https://stackoverflow.com/questions/1537964/visual-c-equivalent-of-gccs-attribute-packed
'IT이야기' 카테고리의 다른 글
Vue Js의 확인란 배열 (0) | 2022.05.04 |
---|---|
C에서 stdin 및 stdout 재라우팅 (0) | 2022.05.04 |
Vuex 상태 변경으로 인해 구성 요소가 다시 렌더링되지 않음 (0) | 2022.05.03 |
Vue.js Safari 모바일 및 호환성 (0) | 2022.05.03 |
Vue.js 2.0 모듈 빌드 실패:구문 오류:웹 팩, Elixir 및 꿀꺽을 사용한 예상치 못한 토큰 (0) | 2022.05.03 |