pragma
-
구조체 바이트 정렬은 만능이 아니다개발/C·C++ 2019. 10. 19. 17:13
pragma once에 이은 만능 시리즈는 아니다. 이 기능들을 별 생각 없이 사용했다가 뇌 곳곳에서 유혈이 낭자한 끝에 얻은 교훈을 남기고 싶을 뿐이다. 공교롭게 둘 다 pragma 키워드를 사용하는 것은 우연의 일치일까. 심도 있게 설명하고 싶지만 아직은 능력이 부족한 탓에 수박 껍질만 핥아보려고 한다. 핥핥핥. 제대로 된 실무 코드는 제대로 본 적이 없지만 소켓 프로그래밍에서는 패킷 헤더는 보통 구조체 바이트 정렬을 하는 것으로 보인다. 구조체 정렬은 함부로 쓰면 안 되지만 패킷 헤더에는 언제나 같은 크기의 데이터가 들어가(야 하)며, 동적으로 메모리를 할당할 일이 없기에 괜찮은 듯하다. 1 2 3 4 5 6 7 #pragma pack(push, 1) struct PacketHeader { shor..
-
pragma once는 만능이 아니다개발/C·C++ 2019. 9. 17. 21:33
pragma once 전처리기는 인클루드가 수행될 때 반복되는 걸 막는 기능을 할 뿐이다. pragma once를 사용했는데도 비주얼 스튜디오에서 LNK2005 오류가 발생하는 이유다. 소스코드의 빌드는 크게 세 가지 과정을 거친다. 전처리, 컴파일, 링킹으로 나눌 수 있는데, 전처리 과정에서는 소스 파일(cpp)에 있는 pragma, include, define 등의 지시자를 처리한다. 전처리 과정에서 문제가 없었으면 컴파일러는 전처리기기가 모두 코드로 대체된 순수한 C++ 소스 코드를 파싱해 어셈블리 코드로 만든다. 그다음에 기계 코드로 번역해 바이너리 파일을 만드는데 이것이 오브젝트 파일이다(.obj). 각각의 소스 코드 별로 독립적으로 컴파일이 완료되면 각각의 오브젝트 파일이 생성된다. 마지막으로..