[고급 C++] 매크로함수

  매크로 함수

 

매크로함수

형식

#define 매크로함수(인자리스트) 대치내용

 

장점

- 매크로 함수는 자료형에 독립적

- 실행속도가 일반함수보다 빠름

- 함수 호출 문장이 전부 매크로 함수 몸체 부분으로 치환되어 코드 크기가 커짐

 

단점

- 매크로 함수는 매크로 대치이므로 의도치 않은 결과를 가져올 수 있음

- 매크로 함수에서 증감연산자 사용하면 안됨

 

예시

     1  #include <stdio.h>
     2  #define SQUARE(x) x*x
     3  #define SQUARE2(x) (x)*(x)
     4
     5  int main()
     6  {
     7     int num;
     8     printf("input number?");
     9
    10     scanf("%d", &num);
    11     printf("%d, square: %d \n", num, square(num+2));
    12     printf("%d, SQUARE: %d \n", num, SQUARE(num+2));
    13     printf("%d, SQUARE2: %d \n", num, SQUARE2(num+2));
    14
    15     return 0;
    16  }
    17
    18  int square(int x)
    19  {
    20     return x*x;
    21  }

input number?5
5, square: 49
5, SQUARE: 17
5, SQUARE2: 49

* 의도치 않은 동작

    10     printf("%d, square: %d \n", num, square(num+2));  => 49

    11     printf("%d, SQUARE: %d \n", num, SQUARE(num+2)); => 5+2*5+2 = 17

→ 괄호로 묶어야함

 

 

 

     1  #include <stdio.h>
     2  #define MAX(x,y) (x>y ? x : y)    //MAX(x++, y++)(x++>y++ ? x++ : y++):
     3  int main()
     4  {
     5     int x = 20, y = 80, z;
     6
     7     z = max(x++, y++);
     8     printf("max : %d, x : %d, y : %d \n", z, x, y);
     9
    10     x = 20, y =80;
    11     z = MAX(x++, y++);
    12     printf("max : %d, x : %d, y : %d \n", z, x, y);
    13
    14     return 0;
    15  }
    16
    17  int max(int x, int y)
    18  {
    19     return (x > y ? x : y);
    20  }

max : 80, x : 21, y : 81
max : 81, x : 21, y : 82

 

매크로 함수 연산자

#

변수명 그대로 사용

 

##

두개의 토큰을 하나의 토큰으로 결합해주는 선행처리기

- 동적 선언 가능

#include<stdio.h>
#define MACRO1(x) printf("%s 의값은 %d 이고, 제곱은 %d이다. \n", #x, x,  x*x)

#define INT_vari(N) int vari##N = N
#define VARI(N) vari##N
int  main()
{
	int num = 5;
	INT_vari(2);
	INT_vari(4);
	INT_vari(6);

	MACRO1(num);
	printf("\n2+4+6 = %d \n", VARI(2)+VARI(4)+VARI(6));
	return 0;
}

num 의값은 5 이고, 제곱은 25이다.
2+4+6 = 12

 

매크로함수 응용

swap 함수

#include <stdio.h>
#define swap(x, y) {x ^= y; y ^= x; x ^= y; }

int main()
{
	int x = 5, y = 6;

	printf("Before x : %d, y : %d \n", x, y);
	
	swap(x, y);
	printf("After x : %d, y : %d \n", x, y);

	return 0;
}

Before x : 5, y : 6
After x : 6, y : 5

 

특정비트 on/off

     3  #define GET_BIT(x, y) (((unsigned int) (x) >> (y)) & 0x01)
     4
     5  #define SET_BIT_ON(x,y) ((unsigned int)(x) | (0x01 << (y)))
     6  #define SET_BIT_OFF(x,y) ((unsigned int)(x) & ~(0x01 << (y)))

 

scanf() 데이터 입력구분자 변경

     1  #include <stdio.h>
     2
     3  int main()
     4  {
     5     char str[10];
     6
     7     printf("input string ? ");
     8     scanf("%s", str);
     9
    10     printf("str : %s \n", str);
    11
    12     return 0;
    13  }

input string ? one two
str : one

* scanf()함수는 문자열 입력시 공백을 포함할 수 없으며, 입력버퍼의 크기를 넘는 것을 제한 할 수 없음

     1  #include <stdio.h>

     2

     3  int main()

     4  {

     5     char str[10];

     6

     7     printf("input string ? ");

     8     scanf("%9[^\n]s", str);   // 입력종료는 엔터로,  9글자

     9     printf("str : %s \n", str);
    10

    12     return 0;

    13  }

input string ? one two
str : one two

* 데이터 구분 문자 변경 및 문자배열 크기 제어

 

 


 

 

 

 

궁금한 사항은 댓글로 남겨주세요💃💨💫
좋아요와 구독(로그인X)은 힘이 됩니다 🙈🙉

 

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️