2020년 7월 1일 수요일

가변인자

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

#include "pch.h"

void LOG_ERROR(const char* text, ...);

void LOG_ERROR2(const char* text, const std::string& callerName, ...);

void LOG_ERROR_ITERATE(int nArgs, ...);

void main()

{

std::string a = "12/1231/123123.txt";

LOG_ERROR("%s is invalid", a.c_str());

LOG_ERROR2("%s is invalid", "gpgp", a.c_str());

LOG_ERROR_ITERATE(3, 1, 2, 3);

}

void LOG_ERROR(const char* text, ...)

{

char buffer[1024];

va_list args;

va_start(args, text);

vsnprintf(buffer, sizeof(buffer), text, args);

va_end(args);

printf(buffer);

printf("\n");

}

void LOG_ERROR2(const char* text, const std::string& callerName, ...)

{

char buffer[1024];

va_list args;

va_start(args, text);

vsnprintf(buffer, sizeof(buffer), text, args);

va_end(args);

printf(buffer);

printf("\n");

}

void LOG_ERROR_ITERATE(int nArgs, ...)

{

va_list args;

va_start(args, nArgs);

for (int i = 0; i < nArgs; i++)

{

int num = va_arg(args, int);

printf("%d ", num);

}

va_end(args);

printf("\n");

}

이번 목적은 c++은 가변인자를 쓰면 첫번째 인자 외에는 다 가변인자 처리 된다는 것을 보여주는 것이다.

va_start 함수에서 첫번째 인자는 va_list 타입인 가변인자 포인터를 받고 두번째는 어떻게 해석할지 인자를 받는다. 세번째 함수처럼 자료형을 받으면 그 자료형으로 해석을 하고, "%s + %d =" 처럼 문자 포맷이 주어진 경우 그 포맷에 맞춰서 가변인자를 해석한다.

va_args 는 고정된 자료형으로 해석을 한 경우 자료형의 크기만큼 포인터를 이동한다.

첫번째 함수와 두번째 함수의 차이는 함수의 인자 갯수 차이이다. 가변인자 함수에 생각없이 인자 두개를 넣고 ...을 넣으면 제대로 된 결과를 얻을 수 없을 것이다.

댓글 없음:

댓글 쓰기

List