๊ฐ๋ณ์ธ์ (variable argument)
๊ฐ๋ณ ์ธ์๋?
C์ธ์ด์์๋ scanf
ํน์ printf
์ฒ๋ผ ๋งค๊ฐ๋ณ์์ ๊ฐ์๋ ํ์
์ด ์ ํด์ง์ง ์์ ํจ์๋ค์ด ์๋ค. ์ด๋ฐ ํจ์๋ค์ ์ฌ์ฉํ ๋๋ง๋ค ๋งค๊ฐ๋ณ์์ ๊ฐ์๊ฐ ๋ฌ๋ผ์ง๋ฉฐ, ์ด๋ฌํ ๊ฒ์ ๊ฐ๋ณ์ธ์๋ผ๊ณ ํ๋ค.
*๋ฐ๋ผ์ ft_printf ํ๋ก์ ํธ์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ด๋ผ๊ณ ํ ์ ์๋ค. *
๊ฐ๋ณ ์ธ์ ํจ์ ์์ฑ
- ํจ์์์ ๊ฐ๋ณ ์ธ์๋ฅผ ์ ์ํ ๋๋ ๊ณ ์ ๋งค๊ฐ๋ณ์๊ฐ ํ๊ฐ ์ด์ ์์ด์ผํ๋ค.
- ๊ณ ์ ๋งค๊ฐ๋ณ์ ๋ค์
...
์ ๋ถ์ฌ ๋งค๊ฐ๋ณ์์ ๊ฐ์๊ฐ ์ ํด์ ธ์์ง ์๋ค๊ณ ํ์๋ฅผ ํด์ค๋ค.
- (๋จ
...
๋ค์๋ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ ์ ์์ผ๋ฏ๋ก ...
์ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ช
์ํด์ผํ๋ค.)
๊ฐ๋ณ ์ธ์ ํจ์ ์์
void va_function(int args, ...)
{
printf("args");
}
int main()
{
va_function(1,2,7);
va_function(1,2,3,4,5,6,7);
return 0;
}
//์ธ์ ๊ฐ์๋ฅผ ๋ฐ๊ฟ๋ฃ์ด๋ ์ปดํ์ผ ์๋ฌ๋ ๋ฐ์ํ์ง ์๋๋ค.
๊ฐ๋ณ ์ธ์ ์ฌ์ฉ
๋ฐ์์จ ๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ <stdarg.h> ํค๋ํ์ผ์ ์ ์๋์ด์๋ ๋งคํฌ๋ก๋ค์ ์ฌ์ฉํด์ผํ๋ค.
<stdarg.h>
ํค๋ํ์ผ์ ์ ์๋์ด ์๋ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ์ธ์๋ฅผ ์ฌ์ฉํ๋ค.
va_list
: ๊ฐ๋ณ ์ธ์ ๋ชฉ๋ก์ ์ ์ธํ๋ typedef (๊ฐ๋ณ์ธ์๋ค์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํฌ์ธํฐ)
va_start(ap, param)
: ๊ฐ๋ณ ์ธ์๋ฅผ ๊ฐ์ ธ์ฌ์ ์๋๋ก ์ค๋นํ๋ค.
va_arg(ap, type)
: ๊ฐ๋ณ ์ธ์ ํฌ์ธํฐ๋ก๋ถํฐ type
ํฌ๊ธฐ๋งํผ ์ญ์ฐธ์กฐ ํ์ฌ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. (๊ฐ์ ธ์จ ์ธ์๋ฅผ ๋ฆฌํดํ๋ค.)
va_end(ap)
: ๊ฐ๋ณ ์ธ์ ํฌ์ธํฐ null๋ก ์ด๊ธฐํ
- ๋ณดํต ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์๋ ๊ฐ๋ณ ์ธ์์ ๊ฐ์๋ฅผ ๋ฐ๋๋ก ์ง์ ํ๋ค.
๊ฐ๋ณ ์ธ์๋ฅผ ์ฌ์ฉํ ํจ์์ฌ์ฉ ์์
#include <stdio.h>
#include <stdarg.h>
int multipleNumbers(int args, ...)
{
va_list ap;
int i = 0;
int ret = 1;
va_start(ap, args);
while (i++ < args)
{
ret *= va_arg(ap, int);
}
return ret;
}
int main()
{
int ret;
ret = multipleNumbers(3, 3, 5, 9); // ๋งค๊ฐ๋ณ์ ๊ฐ์ 3๊ฐ, ๋งค๊ฐ๋ณ์๋ 3, 5, 9
printf("result : %d", ret);
return 0;
}
>>> 135
์ฐธ๊ณ ์๋ฃ
[https://dojang.io/mod/page/view.php?id=577](