htons(), htonl(), ntohs(), ntohl() 함수를 쓰지 않고 직접 구현하기
#include <iostream>
#define uint16_t unsigned short
#define uint32_t unsigned int
#define SWAP_UINT16(x) ((uint16_t)((((x) & 0xff00) >> 8) | (((x) & 0x00ff) << 8)))
#define SWAP_UINT32(x) ((uint32_t) ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)))
// 혹은 + 연산자 사용
//#define swap16(x) ((uint16_t)((((x) >> 8) & 0x00ff) + (((x) & 0x00ff) << 8)))
using namespace std;
int main()
{
uint16_t n = 0xaa14;
cout<<hex<<swap16(n)<<endl;
cout<<swap16(swap16(n))<<endl;
uint32_t num = 0x12345678;
cout<<swap32(num)<<endl;
cout<<swap32(swap32(num))<<endl;
return 0;
}
매크로 함수는 함수처럼 사용할 수 있지만 단순 치환만 하기 때문에 일반 함수와 같이 사용하면 예상과 다른 결과가 나올 수 있다. 따라서 다음의 주의가 필요하다.
매크로 함수 작성시 주의할 점
- 매크로 함수의 전체를 괄호(())로 감싸야 한다.
- 매크로 함수의 인수들도 각각 괄호로 감싸야 한다.
- 매크로 함수를 호출할 때 증감연산자 ++, -- 나 복합 대입 연산자 +=, -= 등은 사용하지 않는 것이 좋다.
#include <stdio.h>
#define SQR(X) ((X)*(X))
#define PRT(a,b) printf("%d의 제곱은 %d입니다.\n", a,b)
int main(void)
{
int result;
int x;
scanf("%d", &x);
result = SQR(x);
PRT(x, result);
return 0;
}
'프로그래밍 > C' 카테고리의 다른 글
C ] 가변인자 매크로를 활용한 디버그 로그 남기기, Predefined macros (0) | 2022.12.11 |
---|---|
전처리기 ] # 문자열화 연산자 (0) | 2022.12.09 |
C ] memset 함수 구현 (0) | 2022.10.09 |
C, Linux ] pthread 사용해 보기 (0) | 2022.08.25 |
C ] 명령 프롬프트 구현 (함수포인터 사용) (0) | 2022.08.25 |