매크로 함수-C언어

홍성우·2023년 5월 23일

자료구조 (C언어)

목록 보기
11/15
post-thumbnail

매크로 와 __inline함수

__inline함수와 매크로는 코드의 재사용성과 실행속도를 개선
컴파일 타임에 모두 삽입 되어 실행된다.

차이점은
__inline함수는 실제 코드가 컴파일되어 삽입 된다. ==> 함수 호출 규약을 따름
매크로는 문자열 치환 개념

[1] 매크로 함수

// 전처리기(preprocssor)는 컴파일러가 소스코드를 컴파일하기에 앞서 선행된느 구문
// 컴파일전에 실행된다.

// 직접 만든 헤더파일이 아니라면 보통 헤더파일은 등록된 위치에 모여 있다.
// '<>' 지정 방법과 " " 지정방법이 있다.
// "" 지정한 경로인 경우 := 시스템 경로가 아니라 프로젝트 경로
// '<>' 지정한 경로 경우 := 시스템 경로에서 탐색

// 매크로 => 함수가 아니다.=> 오버헤드가 발생하지 않는다.
// 매크로는 외형상으로 함수의 모습, 실제로 함수가 아니라 한행 혹은 여러행으로 기술할수 잇는 구문
// 일반적으로 매크로는 사용자가 여러함수기능을 묶어 따고 만든것.

// __inline함수
// 매크로의 발전 형태


#include <stdio.h>

#define ADD(a,b) (a+b)
#define ERROR_MSG(msg) printf("ERROR: %s\n",msg);

int Add(int a, int b)
{
	return a + b;
}

int main() 
{
	printf("%d\n", ADD(3, 4));
	printf("%d\n", ADD(3, 4) * 2);
	ERROR_MSG("Failed to open file");

	return 0;
}

[2] 매크로 연산자

#은 인수가 무엇이든 모두 문자열로 만들어주는 연산자
##은 두 매개 변수를 한덩어리로 묶어 코드를 만들어 주는 함수

#include <stdio.h>

#define STRING(a) #a

// a,b를 합쳐 하난로 붙여주는 매크로 정의
#define PASTER(a,b,c) a##b##c

int Add(int a, int b)
{
	return a + b;
}

int main() 
{
	int nData1 = 10;

	printf("%d\n", PASTER(nDa, t,a1));
	printf("%d\n", nData1);

	// nData1로 처리
	printf("%s\n", STRING(nData1));
	 

	return 0;
}

[3] 조건부 컴파일

조건부 컴파일은 상수 정의 따라 실제로 번역되는 소스코드가 달라지도록 구성한는것

// #은 인수가 무엇이든 모두 문자열로 만들어주는 연산자
// ##은 두 매개 변수를 한덩어리로 묶어 코드를 만들어 주는 함수

// 조건부 컴파일을 이용하여 할수 있는 가장 대표적인 것은 문자열 처리 => 유니코드 기반코드와 MBCS기반 코드

#include <stdio.h>
#define _MSGTEST_ "hi"  // _MSGTEST_ 상수가 정의 1번 실행

#ifdef _MSGTEST_ // _MSGTEST_가 정의 되어 있다면 -- 1번
#define MYMESSAGE "Hello"
#else
#define MYMESSAGE "world" // _MSGTEST_가 정의 되어 있지 않다면 -- 2번
#endif

int main() 
{
	puts(MYMESSAGE);

	return 0;
}


[4] 조건부 컴파일 문자 형식 처리

#include <stdio.h>

#define UNICODE

#ifdef UNICODE
	typedef wchar_t TCHAR; //한글자당 2BYTE
    #define _T(string) L##STRING // LSTIRNG을 L##STRING으로 처리(유니코드 형식)
    #define PRINT wprintf // 유니코드 문자열 출력 함수 wprintf
#else
	typedef char TCHAR;
    #define _T(string)
    #define PRINT printf
#endif

int main() 
{
	TCHAR szData[16] = _T("String"); // 2Byte
	PRINT(_T("%s\n"), szData); // LSTIRNG형식으로 처리(유니코드 문자열로 처리)
	PRINT(_T("%d, %d\n"), sizeof(TCHAR), sizeof(szData)); // 2byte *12 

	return 0;
}

조건부 컴파일 모드


Debug mode

Release mode

캡쳐를 보면 컴파일모드에 따라 컴파일모드가 활성화 된것을 알수 있다.

profile
제 블로그를 방문해 주셔서 감사합니다

0개의 댓글