°¡º¯ Àμö´Â ÀμöÀÇ °³¼ö¿Í ŸÀÔÀÌ °íÁ¤ÀûÀ¸·Î Á¤ÇØÁ® ÀÖÁö ¾Ê´Ù´Â ¶æÀ̸ç ÀÓÀÇ Å¸ÀÔÀÇ Àμö¸¦ ÀÓÀÇ °³¼ö¸¸Å ¹Þ´Â´Ù. ¿©±â¼´Â ÀÌ·± ÇÔ¼ö¸¦ ¸¸µå´Â ¹æ¹ý°ú ¿ø¸®¿¡ ´ëÇØ ¿¬±¸ÇØ º¸ÀÚ. Æ÷ÀÎÅÍ
¿¬»êÀÌ ¸¹°í º¹ÀâÇØ ¾î·ÆÁö¸¸ Æ÷ÀÎÅ͸¦ °¡Àå Àß ÀÀ¿ëÇÑ ¿¹¸¦ »ìÆ캼 ¼ö ÀÖ´Ù. °¡º¯ Àμö¸¦ Á¦´ë·Î ÀÌÇØÇÏ·Á¸é
Æ÷ÀÎÅÍ¿¡ ´ëÇÑ À̷аú ½ºÅà ÇÁ·¹ÀÓÀÇ ±¸Á¶¸¦ Àß ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.
°¡º¯ Àμö ÇÔ¼ö´Â ±²ÀåÈ÷ º¹ÀâÇÑ ±¸Á¶¸¦ °¡Áö°í ÀÖÁö¸¸ ¿ª¼³ÀûÀÌ°Ôµµ C¸¦
¹è¿ï ¶§ °¡Àå ¸ÕÀú Á¢ÇÏ´Â printf°¡ ´ëÇ¥ÀûÀÎ °¡º¯ Àμö ÇÔ¼öÀÌ´Ù.
printf´Â ¼½Ä ¹®ÀÚ¿ Çϳª¿Í ¼½Ä¿¡ ´ëÀÀµÇ´Â ÀÓÀÇ Å¸ÀÔÀÇ Àμö¸¦ °³¼ö¿¡ »ó°ü¾øÀÌ Àü´Þ¹Þ¾Æ º¯¼öÀÇ °ªÀ» Ãâ·ÂÇÑ´Ù.
printf("Á¤¼ö´Â %dÀÌ°í
½Ç¼ö´Â %fÀÌ´Ù.",i,d);
printf("À̸§=%s, ³ªÀÌ=%d, Å°=%f","±è»óÇü",25,178.8);
printf("%d + %f = %f", 123, 3.14,
123+3.14);
ÀμöÀÇ °³¼ö³ª ŸÀÔÀÌ Á¦°¢°¢ÀÌÁö¸¸ Àß ÄÄÆÄÀϵǰí Àß ½ÇÇàµÈ´Ù. ¹Ý¸é strcpy³ª malloc °°Àº ÇÔ¼ö´Â ¿øÇü¿¡ Á¤ÀÇµÈ Àμö¸¦ Á¤È®ÇÏ°Ô
Àü´ÞÇØ¾ß ÇÑ´Ù. ¸ðÀÚ¶óµµ ¾ÈµÇ°í ³²¾Æµµ ¾ÈµÇ¸ç ŸÀÔÀÌ Æ²·Áµµ ¿¡·¯·Î 󸮵ȴÙ. printf´Â ¾î¶»°Ô ¼±¾ðµÇ¾î Àֱ淹 °¡º¯ Àμö¸¦ ôô ó¸®ÇÏ´ÂÁö ¿øÇüºÎÅÍ »ìÆ캸ÀÚ.
int printf( const char *format, ... );
ù ¹ø° ÀμöÀÎ formatÀº ¹®ÀÚ¿ »ó¼ö·Î µÈ ¼½Ä ¹®ÀÚ¿ÀÌ´Ù. µÎ ¹ø° ÀÌÈÄÀÇ Àμö´Â ŸÀÔ°ú À̸§ÀÌ ¾ø°í ´ë½Å »ý·« ±âÈ£(ellipsis)ÀÎ ...¸¸ Ç¥½ÃµÇ¾î ÀÖ´Ù. ÀÌ ±âÈ£´Â ÀÌÈÄÀÇ Àμö¿¡ ´ëÇØ °³¼ö¿Í ŸÀÔÀ»
Á¡°ËÇÏÁö ¸»¶ó´Â Áö½Ã »çÇ×À̸ç ÀÖ´Â ±×´ë·Î Àü´ÞÇÑ´Ù. ¾î¶² ÀμöµçÁö ¿Ã ¼ö ÀÖÁö¸¸ Àü´ÞµÈ Àμö¸¦ Çؼ®ÇÏ°í
Àд °ÍÀº ÇÔ¼ö°¡ ¾Ë¾Æ¼ ÇØ¾ß ÇÑ´Ù.
»ý·« ±âÈ£ ÀÌÀüÀÇ °íÁ¤ Àμö´Â ¿øÇü¿¡ ¸í½ÃµÇ¾î Àִ´ë·Î Àü´ÞÇÑ´Ù. printfµµ
ù ¹ø° Àμö´Â ¹®ÀÚ¿ ŸÀÔÀÇ formatÀ¸·Î °íÁ¤µÇ¾î ÀÖÀ¸´Ï ¹Ýµå½Ã ¼½Ä ¹®ÀÚ¿À» Àü´ÞÇØ¾ß ÇÑ´Ù. ¾Æ¹«¸® °¡º¯ Àμö¸¦ Áö¿øÇÑ´Ù°í ÇÏ´õ¶óµµ printf(1234)³ª printf(3.14) µûÀ§·Î È£ÃâÇÒ ¼ö´Â ¾ø´Ù. ¼½Ä ¹®ÀÚ¿ÀÌ ÀÏ´Ü
¸ÕÀú ¿À°í ±× µÚÂÊÀº ÇÊ¿äÇѸ¸Å ÀÚÀ¯·Ó°Ô Àü´ÞÇÑ´Ù.
¼½Ä ¹®ÀÚ¿¿¡ Æ÷ÇÔµÈ ¼½ÄÀÇ °³¼ö¿Í ŸÀÔ¿¡ ¸Â´Â Àμö°¡ ¿Â´Ù. °¡º¯
Àμö ÇÔ¼ö¸¦ ¸¸µå´Â °ü°ÇÀº Àڽſ¡°Ô Àü´ÞµÈ Àμö¸¦ ¼ø¼¿¡ ¸Â°Ô ²¨³» Á¤È®ÇÑ °ªÀ» Àд °ÍÀÌ´Ù. °³·«ÀûÀÎ
±¸Á¶´Â ´ÙÀ½°ú °°´Ù.
void VarFunc(int Fix, ...)
{
va_list
ap;
va_start(ap,Fix);
while
(¸ðµç Àμö¸¦ ´Ù ÀÐÀ» ¶§±îÁö) {
va_arg(ap,ÀμöŸÀÔ);
}
va_end(ap);
}
ÇÔ¼öÀÇ À̸§À̳ª °íÁ¤ Àμö´Â ¸¶À½´ë·Î ÀÛ¼ºÇÒ ¼ö ÀÖµÇ ¸¶Áö¸· Àμö ÀÚ¸®¿¡
...ÀÌ ÀÖ¾î¾ß ÇÑ´Ù. º»Ã¼¿¡¼´Â ¸ÅÅ©·Î ±¸¹®À¸·Î Àμö¸¦ Àд´Ù. °¢ ±¸¹®ÀÇ Àǹ̴ ´ÙÀ½°ú °°´Ù.
va_list ap : ÇÔ¼ö·Î Àü´ÞµÈ Àμö´Â ½ºÅÿ¡ ÀúÀåµÇ¸ç ½ºÅÃÀ»
ÀÐÀ¸·Á¸é Æ÷ÀÎÅÍ ¿¬»êÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ ¿¬»êÀ» À§ÇØ va_list ÇüÀÇ
º¯¼ö¸¦ ¼±¾ðÇÑ´Ù. °¡º¯ Àμö¸¦ Àбâ À§ÇÑ Áغñ¿¡ ÇØ´çÇÑ´Ù.
va_start(ap, ¸¶Áö¸·°íÁ¤Àμö) : °¡º¯ Àμö¸¦ Àбâ À§ÇØ ap º¯¼ö¸¦ ÃʱâÈÇÑ´Ù. ¸¶Áö¸· °íÁ¤ Àμö¸¦ Àü´ÞÇϸé ÀÌ µÚÂÊ¿¡ Àִ ù ¹ø° °¡º¯ ÀμöÀÇ ¹øÁö¸¦ ¾Ë¾Æ³»¾î ap¿¡ ´ëÀÔÇÑ´Ù. ÀÌÈÄ ap¸¦
ÅëÇØ °¡º¯ Àμö¸¦ Àд´Ù.
va_arg(ap, ÀμöŸÀÔ) : °¡º¯
Àμö¸¦ ÀÐ¾î ¸®ÅÏÇÑ´Ù. ù ¹ø° °¡º¯ Àμö ÀÚ¸®¸¦ °¡¸®Å°´Â ap¸¦
ÅëÇØ °ªÀ» Àдµ¥ ŸÀÔÀÌ ¹«¾ùÀÎÁö´Â ¹Ì¸® ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. °¡º¯ Àμö Çϳª¸¦ ÀÐÀº ÈÄ ap¸¦ ´ÙÀ½ °¡º¯ Àμö ÀÚ¸®·Î ¿Å±â¹Ç·Î va_arg¸¦ ¹Ýº¹ÀûÀ¸·Î È£ÃâÇϸé
¸ðµç Àμö¸¦ ´Ù ÀÐÀ» ¼ö ÀÖ´Ù.
va_end(ap) : °¡º¯ Àμö¸¦ ´Ù ÀÐÀº ÈÄ µÞÁ¤¸®¸¦ Çϴµ¥ ÀÎÅÚ
°è¿ Ç÷§Æû¿¡¼´Â ¾Æ¹« µ¿ÀÛµµ ÇÏÁö ¾Ê´Â´Ù. ´Ù¸¥ Ç÷§Æû¿¡¼´Â °¡º¯ Àμö¸¦ Àд ¹æ¹ýÀÌ ´Þ¶ó µÞÁ¤¸®°¡
ÇÊ¿äÇÒ ¼öµµ ÀÖ¾î ¸ÅÅ©·Î¸¸ ¹Ì¸® ¸¸µé¾î ³õ¾Ò´Ù.
ÀÌ ¼³¸í¸¸À» º¸°í °¡º¯ Àμö ÇÔ¼ö¸¦ ôô ¸¸µé¾î ³»±â´Â ½±Áö ¾Ê´Ù. ½ÇÁ¦
µ¿ÀÛÇÏ´Â ¿¹Á¦¸¦ ¸¸µé¾î º¸°í ±¸Á¶¸¦ ºÐ¼®ÇØ º¸ÀÚ. ´ÙÀ½ ¿¹Á¦ÀÇ
GetSum ÇÔ¼ö´Â ù ¹ø° Àμö·Î Àü´ÞµÈ num °³ÀÇ Á¤¼ö Àμö¸¦ ¸ðµÎ ´õÇØ Çհ踦 ¸®ÅÏÇÑ´Ù.
#include <stdio.h>
#include <stdarg.h>
int GetSum(int num, ...)
{
int
sum = 0;
va_list
ap;
va_start(ap,
num);
for
(int i = 0; i<num; i++) {
sum
+= va_arg(ap, int);
}
va_end(ap);
return
sum;
}
int main()
{
printf("1
+ 2 = %d\n", GetSum(2, 1, 2));
printf("3
+ 4 + 5 + 6 = %d\n", GetSum(4, 3, 4, 5, 6));
printf("10
~ 15 = %d\n", GetSum(6, 10, 11, 12, 13, 14, 15));
}
1 + 2 = 3
3 + 4 + 5 + 6 = 18
10 ~ 15 = 75
numÀº µÚ¿¡ ¸î °³ÀÇ Á¤¼ö Àμö°¡ Àü´ÞµÇ´ÂÁö¸¦ ¾Ë·Á ÁÖ´Â °íÁ¤ ÀμöÀ̸ç
ÀÌ °³¼ö¸¸ÅÀÇ Á¤¼ö Àμö°¡ µû¶ó¿Â´Ù. Àμö°¡ ¸î °³À̵簣¿¡ Àü´ÞµÈ ¸ðµç °ªÀ» ´Ù ´õÇØ Çհ踦 ±¸ÇÑ´Ù. ¾Õ¿¡¼ º¸ÀÎ °³·«ÀûÀÎ ±¸Á¶´ë·Î GetSum ÇÔ¼ö¸¦ ÀÛ¼ºÇß´Ù.
ÇÕ°è ´©ÀûÀ» À§ÇÑ sumÀº 0À¸·Î
ÃʱâÈÇÑ´Ù. va_listÇüÀÇ Æ÷ÀÎÅÍ ap¸¦ ¼±¾ðÇÏ°í va_start È£Ãâ·Î ap¸¦ °íÁ¤ Àμö num ´ÙÀ½ÀÇ À§Ä¡¿¡ ¸ÂÃá´Ù. ±×¸®°í num¸¸Å ·çÇÁ¸¦ µ¹¸ç va_arg(ap, int) È£Ãâ·Î ´ÙÀ½ Á¤¼ö°ªÀ»
±¸ÇØ sum¿¡ ´©Àû½ÃŲ´Ù. ¸ðµç Àμö¸¦ ´Ù ´õÇÑ ÈÄ va_end·Î µÞÁ¤¸®¸¦ ÇÏ°í °è»êµÈ sumÀ» ¸®ÅÏÇÑ´Ù. °¡º¯ Àμö ÇÔ¼ö´Â ±¸Á¶°¡ °ÅÀÇ ºñ½ÁÇϹǷΠÀÌ ÇÔ¼ö¸¦ µû¶óÇÏ¸é ½±°Ô ¸¸µé ¼ö ÀÖ´Ù.
°¡º¯ Àμö ÇÔ¼ö°¡ Àμö¿¡ ´ëÇÑ Á¦¾àÀÌ ´ú ÇÏ´Ù°í Çؼ ¾Æ¹« Àμö³ª ¸¶À½´ë·Î Àü´ÞÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. °¡º¯ÀÌ´õ¶óµµ ÁöÄÑ¾ß ÇÒ ±ÔÄ¢ÀÌ ÀÖ´Ù.
- óÀ½ºÎÅÍ °¡º¯ Àμö°¡ ¿Ã ¼ö´Â ¾øÀ¸¸ç Çϳª ÀÌ»óÀÇ °íÁ¤ Àμö°¡
ÀÖ¾î¾ß ÇÑ´Ù. ù ¹ø° °¡º¯ Àμö´Â °íÁ¤ Àμö ¹Ù·Î ´ÙÀ½¿¡ ¿À´Âµ¥ ÀÌ À§Ä¡¸¦ ã±â À§ÇØ °íÁ¤ ÀμöÀÇ
À§Ä¡¸¦ ÂüÁ¶ÇÑ´Ù. °íÁ¤µÈ Àμö°¡ ¾øÀ¸¸é ½ºÅÃÀ» Á÷Á¢ µÚÁ®¾ß ÇÏ´Ï ¾î·Æ°í À̽ļºÀ» È®º¸Çϱ⵵ ¾î·Æ´Ù. GetSum ÇÔ¼ö´Â Á¤¼öÀÇ °³¼öÀÎ numÀÌ °íÁ¤ ÀμöÀ̸ç printf´Â ¼½Ä ¹®ÀÚ¿ÀÌ °íÁ¤ ÀμöÀÌ´Ù.
- ¸î °³ÀÇ °¡º¯ Àμö°¡ Àü´ÞµÇ´ÂÁö ÇÔ¼ö ³»ºÎ¿¡¼ ¾Ë ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÄÄÆÄÀÏ·¯´Â ÀüÇô °£¼·ÇÏÁö ¾ÊÀ¸¹Ç·Î È£ÃâÃø¿¡¼ ÀμöÀÇ °³¼ö¸¦ ¾Ë·Á ÁÖÁö ¾ÊÀ¸¸é ÇÔ¼ö ½º½º·Î ÀμöÀÇ °³¼ö¸¦ ¾Ë
¹æ¹ýÀÌ ¾ø´Ù. °¡º¯ ÀμöÀÇ °³¼ö´Â °íÁ¤ Àμö·Î ¾Ë·Á ÁØ´Ù.
GetSumÀº numÀ¸·Î µÚ¿¡ ¸î °³ÀÇ Á¤¼ö°¡ ÀÖ´ÂÁö ¾Ë·Á ÁÖ¸ç º»Ã¼¿¡¼´Â num¸¸Å ·çÇÁ¸¦ µ¹¸é¼ Àμö¸¦ Àд´Ù.
¸í½ÃÀûÀ¸·Î °³¼ö¸¦ ¾Ë·Á ÁÖ´Â °ÍÀÌ °¡Àå Á÷°üÀûÀÌÁö¸¸ °³¼ö°¡ ¹Ù²ð ¶§¸¶´Ù °íÁ¤ Àμö¸¦ ¸Å¹ø ¼öÁ¤ÇØ¾ß ÇÏ´Ï ºÒÆíÇÑ
¸éµµ ÀÖ°í ½ÇÁ¦ °³¼ö¿Í ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é À§ÇèÇÑ ¸éµµ ÀÖ´Ù. Á¦ÀÏ ¸¶Áö¸· Àμö·Î ƯÀÌ°ªÀ» Àü´ÞÇÏ¿© ³¡À»
Ç¥½ÃÇÏ´Â ¹æ¹ýÀ» ¾µ ¼öµµ Àִµ¥ ¿¹¸¦ µé¾î 0À» ÀμöÀÇ ³¡À¸·Î Á¤ÀÇÇÏ¸é µÈ´Ù.
#include <stdio.h>
#include <stdarg.h>
void PrintSum(const char *msg, ...)
{
int
sum = 0;
va_list
ap;
int
arg;
va_start(ap,
msg);
for
(;;) {
arg
= va_arg(ap, int);
if
(arg == 0) {
break;
}
sum
+= arg;
}
va_end(ap);
printf(msg,
sum);
}
int main()
{
PrintSum("1
+ 2 = %d\n", 1, 2, 0);
PrintSum("3
+ 4 + 5 + 6 = %d\n", 3, 4, 5, 6, 0);
PrintSum("10
~ 15 = %d\n", 10, 11, 12, 13, 14, 15, 0);
}
PrintSum ÇÔ¼ö´Â ¼½Ä ¹®ÀÚ¿°ú Á¤¼öÀÇ ¸ñ·ÏÀ» ¹ÞµÇ ¸¶Áö¸· Àμö´Â
Ç×»ó 0ÀÌ´Ù. º»Ã¼¿¡¼´Â ¹«ÇÑ ·çÇÁ¸¦ µ¹¸ç 0À» ¸¸³¯¶§±îÁö Çհ踦 ±¸ÇÑ´Ù. GetSumÀº ¸í½ÃÀûÀ¸·Î °³¼ö¸¦ ¾Ë·ÁÁÖ°í PrintSumÀº ƯÀÌ°ªÀ¸·Î ³¡À» Ç¥½ÃÇϴµ¥ ¾î¶² ¹æ½ÄÀ̵ç ÇÔ¼ö ³»ºÎ¿¡¼ ÀμöÀÇ °³¼ö¸¦ ¾Ë ¼ö ÀÖÀ¸¸é µÈ´Ù.
±×·¸´Ù¸é Ç¥ÁØ ÇÔ¼öÀÎ printf´Â ÀμöÀÇ °³¼ö¸¦ ¾î¶»°Ô ÆľÇÇÒ±î? °³¼ö¸¦ ¾Ë·Á ÁÖ´Â °íÁ¤ Àμöµµ ¾ø°í ƯÀÌ°ªµµ ¾ø¾î ÀμöÀÇ °³¼ö¸¦ ¾Ë ¼ö ¾øÀ» °Í °°Áö¸¸ Àß °üÂûÇØ º¸¸é ¼½Ä
¹®ÀÚ¿ ³»ÀÇ ¼½Ä °³¼ö°¡ ÀμöÀÇ °³¼öÀÌ´Ù. %d, %s °°Àº ¼½ÄÀ» ¸¸³¯ ¶§¸¶´Ù µÚÂÊÀÇ °¡º¯ Àμö¸¦
¼ø¼´ë·Î ÀÐ¾î ¹®ÀÚ¿À» Á¶¸³ÇÑ´Ù.
- °³¼ö¿Í ¸¶Âù°¡Áö·Î ÇÔ¼ö ³»ºÎ¿¡¼ °¡º¯ ÀμöÀÇ Å¸ÀÔµµ ¾Ë ¼ö ÀÖ¾î¾ß
ÇÑ´Ù. GetSumÀº ¸ðµç Àμö°¡ Á¤¼öÇüÀÌ°í printf´Â
¼½Ä¿¡ ŸÀÔ Á¤º¸°¡ Æ÷ÇԵǾî ÀÖ´Ù. ¾Æ´Ï¸é ù ¹ø°´Â Á¤¼ö, µÎ
¹ø° ÀÌÈÄ´Â ½Ç¼ö ½ÄÀ¸·Î ¹Ì¸® ¾à¼ÓµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. va_arg ¸ÅÅ©·Î´Â ap ¹øÁö¿¡¼ Àμö°ªÀ» ÀÐÀ» ¶§ ±æÀÌ¿Í ºñÆ® Çؼ® ¹æ¹ýÀ» ¾Ë¾Æ¾ß Çϸç ÀÌ Á¤º¸°¡ ¹Ù·Î ŸÀÔÀÌ´Ù.
ÀμöÀÇ Å¸ÀÔÀÌ Á¦°¢°¢À̶ó¸é °íÁ¤ Àμö¸¦ ÅëÇØ ÀμöÀÇ Å¸ÀÔ Á¤º¸¸¦ Àü´ÞÇÑ´Ù. ´ÙÀ½
¿¹Á¦ÀÇ GetSum2 ÇÔ¼ö´Â types °íÁ¤ Àμö¿¡ ÀμöÀÇ
ŸÀÔÀ» °£·«ÇÑ ¾ËÆĺªÀ¸·Î Àü´ÞÇÑ´Ù. ¿¹¸¦ µé¾î types°¡ "iidd"¶ó¸é ¾ÕÂÊ µÎ °³´Â Á¤¼öÀÌ°í µÚÂÊ µÎ°³´Â ½Ç¼öÇüÀÌ¸ç ¾ËÆĺªÀÌ 4°³ ÀÖÀ¸¹Ç·Î ÀμöÀÇ °³¼ö´Â 4°³ÀÌ´Ù.
#include <stdio.h>
#include <stdarg.h>
double GetSum2(const char *types, ...)
{
double
sum = 0;
va_list
ap;
const
char *p;
va_start(ap,
types);
for (p
= types; *p; p++) {
switch
(*p) {
case
'i':
sum
+= va_arg(ap, int);
break;
case
'd':
sum
+= va_arg(ap, double);
break;
}
}
va_end(ap);
return
sum;
}
int main()
{
printf("1
+ 2 = %f\n", GetSum2("ii", 1, 2));
printf("2.5
+ 3.8 + 4 = %f\n", GetSum2("ddi", 2.5, 3.8, 4));
printf("1
+ 2.345 + 6 + 7.8901 = %f\n", GetSum2("idid", 1, 2.345, 6,
7.8901));
}
1 + 2 = 3.000000
2.5 + 3.8 + 4 = 10.300000
1 + 2.345 + 6 + 7.8901 = 17.235100
type ¹®ÀÚ¿ÀÇ ±æÀ̸¸Å ·çÇÁ¸¦ µ¹¸ç ¾ÕÂÊ ¹®ÀÚºÎÅÍ ¼ø¼´ë·Î Àд´Ù. types °íÁ¤ Àμö¿¡ ÀμöÀÇ °³¼ö¿Í ŸÀÔ Á¤º¸°¡ ¸ðµÎ Æ÷ÇԵǾî ÀÖ¾î Á¤¼ö,
½Ç¼ö¸¦ ¸¶²Ù ¼¯¾î Àü´ÞÇصµ ÇÔ¼ö°¡ ŸÀÔÀ» Á¤È®ÇÏ°Ô Àо´Ù. iÀ̸é va_arg(ap, int)·Î Á¤¼ö¸¦ Àаí dÀ̸é va_arg(ap, double)·Î ½Ç¼ö¸¦ Àд´Ù. ¾ËÆĺª ±âÈ£¸¦
´õ Á¤ÀÇÇÏ¸é ¾ó¸¶µçÁö ´Ù¾çÇÑ Å¸ÀÔÀ» Àü´ÞÇÒ ¼ö ÀÖ´Ù.
ÀÌ ¿¹Á¦ÀÇ Äڵ忡¼ va_arg(ap, int)¶ó´Â Äڵ尡 ¿ä»óÇØ
º¸À̴µ¥ °ªÀÌ ¾Æ´Ñ int³ª double °°Àº ŸÀÔÀÌ Àμö·Î
Àü´ÞµÇ´Â °ÍÀÌ ºñ»ó½ÄÀûÀÌ´Ù. ŸÀÔÀº Å°¿öµå¿©¼ °ªÀÌ ¾Æ´Ï¸ç ÇÔ¼öÀÇ Àμö°¡ µÉ ¼ö ¾ø´Âµ¥ va_arg´Â ŸÀÔÀ» ¹Þ´Â´Ù. ÀÌ°ÍÀÌ °¡´ÉÇÑ ÀÌÀ¯´Â va_arg°¡ ÁøÂ¥ ÇÔ¼ö°¡ ¾Æ´Ñ ¸ÅÅ©·ÎÀ̸ç ŸÀÔ Àμö´Â sizeof ¿¬»êÀÚ¿Í
ij½ºÆ® ¿¬»êÀÚ¿¡ »ç¿ëµÇ±â ¶§¹®ÀÌ´Ù. Àá½Ã ÈÄ ³»ºÎ Äڵ带 ºÐ¼®ÇØ º¸ÀÚ.
°¡º¯ Àμö ÇÔ¼ö¸¦ ¸¸µå´Â ±ÔÄ¢À» °£´ÜÈ÷ ¿ä¾àÇÏ¸é ¸¶À½´ë·Î Àμö¸¦ Àü´ÞÇ쵂 ¾î¶² Àμö¸¦ ¸î °³³ª Àü´ÞÇß´ÂÁö ÇÔ¼ö¿¡°Ô
Á¤º¸¸¦ Á¦°øÇØ¾ß ÇÑ´Ù. ÀÌ ±ÔÄ¢¸¸ ÁöŲ´Ù¸é Àμö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë·Á ÁÖ´Â ¹æ¹ýÀº ÀÚÀ¯·Ó°Ô ¼±ÅÃÇÒ ¼ö
ÀÖ´Ù.
°¡º¯ Àμö ÇÔ¼ö´Â È£ÃâÃø¿¡¼ ÇÊ¿äÇѸ¸Å Àμö¸¦ Àü´ÞÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù. ±×·¯³ª
ÀÚÀ¯¿¡´Â ¾ðÁ¦³ª Ã¥ÀÓÀÌ µû¸£´Â ¹ýÀ̶ó ±ÔÄ¢À» Á¦´ë·Î ÁöÅ°Áö ¾ÊÀ¸¸é ¾î¶² °á°ú°¡ ¹ß»ýÇÒÁö Àå´ãÇÒ ¼ö ¾ø´Ù. °¡º¯
Àμö ÇÔ¼ö¸¦ À߸ø È£ÃâÇßÀ» ¶§ ¾î¶»°Ô µÇ´ÂÁö ´ÙÀ½ ¿¹Á¦·Î ½ÇÇèÇØ º¸ÀÚ.
#include <stdio.h>
#include <conio.h>
int main()
{
printf("%d%d\n",
1, 2); getch();
printf("%d%d%d\n",
1, 2, 3, 4, 5); getch();
printf("%d%d\n",
1, 3.14); getch();
printf("%f%f\n",
1, 2); getch();
printf("%s\n",
1); getch();
}
12
123
11374389535
0.0000000.000000
°¢ printf È£Ãâ »çÀÌ¿¡
getch È£ÃâÀ» ³Ö¾î ÇÑ ÁÙ¾¿ õõÈ÷ °á°ú¸¦ »ìÆìµµ·Ï Çß´Ù. ù ¹ø° È£ÃâÀº ¼½Ä¿¡ ¸Â°Ô 2°³ÀÇ Á¤¼öÇü Àμö¸¦ Á¦´ë·Î Àü´ÞÇßÀ¸´Ï Àß µ¿ÀÛÇÑ´Ù. µÎ ¹ø° È£Ãâ¹®Àº
¼½Äº¸´Ù ´õ ¸¹Àº Àμö¸¦ Àü´ÞÇߴµ¥ ÀÌ °æ¿ìµµ ½ÇÇàÀº Àß µÇÁö¸¸ µÚÂÊÀÇ ³²´Â Àμö°¡ ¹«½ÃµÈ´Ù. ¸ðÀÚ¶õ
°ÍÀº ¹®Á¦Áö¸¸ ³²´Â °ÍÀº ¹®Á¦µÇÁö ¾Ê´Â´Ù.
¼¼ ¹ø° È£ÃâÀº °³¼ö´Â ¸ÂÁö¸¸ µÚÂÊ %d°¡ ½Ç¼ö »ó¼ö¿Í ´ëÀÀµÇ¾î ŸÀÔÀÌ
¸ÂÁö ¾Ê´Ù. ÀÌ °æ¿ì printf´Â »ó¼ö 3.14¸¦ Á¤¼ö·Î Àоî Çؼ®ÇÏ¸ç µû¶ó¼ ¾û¶×ÇÑ ¼ýÀÚ°¡ Ãâ·ÂµÈ´Ù. ³×
¹ø° È£Ãâµµ %f¿¡ Á¤¼ö¸¦ ´ëÀÀ½ÃÄÑ Á¤¼ö¸¦ ½Ç¼ö ºñÆ®·Î Çؼ®ÇϹǷΠÀμöÀÇ °ªÀÌ Á¦´ë·Î Ãâ·ÂµÇÁö ¾Ê´Â´Ù. ¸¶Áö¸· È£Ãâ¹®Àº %s·Î ¹®ÀÚ¿À» Ãâ·ÂÇÏÁö¸¸ ½ÇÁ¦ Àμö´Â Á¤¼ö¿©¼
½É°¢ÇÏ´Ù. printf´Â 1¹øÁö¸¦ ÀÐÀ¸·Á°í ½ÃµµÇϸç ÀÌ À§Ä¡´Â
½Ã½ºÅÛ ¿µ¿ªÀÌ¾î¼ ±× ÀÚ¸®¼ Áï»çÇØ ¹ö¸°´Ù.
º¸´Ù½ÃÇÇ °¡º¯ Àμö ÇÔ¼ö¸¦ À߸ø »ç¿ëÇϸé ÀÌ·¸°Ô À§ÇèÇÏ´Ù. ÇÏÁö¸¸
Ä¡¸íÀûÀÎ Äڵ带 ÀÛ¼ºÇصµ ÄÄÆÄÀÏ·¯´Â »·»·½º·´°Ô 0 error 0 warning ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. ±× ÀÌÀ¯´Â printf ÇÔ¼öÀÇ ¿øÇü¿¡ ...À̶ó°í µÇ¾î ÀÖ¾î Àμö¿¡ ´ëÇØ ¾î¶°ÇÑ °£¼·µµ ÇÏÁö ¸»¶ó°í Ç߱⠶§¹®ÀÌ´Ù.
ÄÄÆÄÀÏ·¯´Â À§ Äڵ尡 À§ÇèÇÑÁö ¾Æ´ÑÁö ÆǺ°ÇÒ ´É·Âµµ ±ÇÇѵµ ¾ø´Ù. ±×·¡¼ °¡º¯ Àμö´Â ÃæºÐÈ÷
ÁÖÀǸ¦ ±â¿ï¿© »ç¿ëÇØ¾ß ÇÑ´Ù.
°¡º¯ Àμö ÇÔ¼öÀÇ È°¿ë°ú Á¦ÀÛ¸¸À» ¸ñÀûÀ¸·Î ÇÑ´Ù¸é ¿©±â±îÁö¸¸ ÀÌÇØÇصµ ÃæºÐÇÏ´Ù.
±×·¯³ª °¡º¯ Àμö°¡ ¾î¶² ½ÄÀ¸·Î µ¿ÀÛÇÏ´ÂÁö È£±â½ÉÀÌ ¹ßµ¿ÇÑ´Ù¸é va_arg ¸ÅÅ©·Î¸¦ ºÐ¼®ÇØ
ºÁ¾ß ÇÑ´Ù. ªÀº ¸ÅÅ©·ÎÁö¸¸ Æ÷ÀÎÅÍ ¿¬»ê°ú sizeof ¿¬»êÀÚ, ºñÆ® ¿¬»êÀÚ¸¦ Àý¹¦ÇÏ°Ô È°¿ëÇÑ Äڵ带 º¼ ¼ö ÀÖ¾î Æ÷ÀÎÅÍ ¿¬±¸ °úÁ¦·Î °¡Ä¡°¡ ³ô´Ù.
ÄÄÆÄÀÏ·¯°¡ °¡º¯ Àμö¿¡ ´ëÇØ Áö¿øÇÏ´Â °ÍÀº Àμö Á¡°ËÀ» ¹«½ÃÇÏ´Â ... ¹Û¿¡
¾ø´Ù. ÀÌ ±âÈ£´Â °¡º¯ Àμö¿¡ ´ëÇÑ Çã¶ôÀÌ ¾Æ´Ï¶ó »ç½ÇÀº ¹«°ü½ÉÀÌ´Ù.
ÄÄÆÄÀÏ·¯°¡ °¡º¯ Àμö¸¦ Ưº°ÇÏ°Ô Ã³¸®ÇÏ´Â °ÍÀÌ ¾Æ´Ï¸ç ±×·¸´Ù°í ¶óÀ̺귯¸®°¡ Áö¿øÇÏ´Â °Íµµ ¾Æ´Ï´Ù. °¡º¯
Àμö¿¡ ´ëÇÑ ¸ðµç ±â´ÉÀº Ç¥ÁØ Çì´õ ÆÄÀÏÀÎ stdarg.h¿¡ Á¤ÀÇµÈ ¸ÅÅ©·Î°¡ ±¸ÇöÇÑ´Ù.
Çì´õ ÆÄÀÏÀ» ¿¾î º¸¸é ÀÌ ¸ÅÅ©·Î ±¸¹®À» º¼ ¼ö ÀÖ´Ù. ½ÇÁ¦ ±¸¹®Àº
Ç÷§ÆûÀ̳ª ÄÄÆÄÀÏ·¯¸¶´Ù Á¶±Ý¾¿ ´Ù¸£°í ȣȯ¼º, À̽ļº È®º¸¸¦ À§ÇÑ ±º´õ´õ±â°¡ ¸¹¾Æ Àб⠾î·Æ´Ù. ´ÙÀ½Àº °¡Àå °£·«ÇÏ°Ô Àß Á¤ÀÇµÈ ÄÚµåÀÌ¸ç ³î¶øµµ·Ï ª´Ù. ´Ù¸¥ ÄÄÆÄÀÏ·¯³ª
Ç÷§ÆûÀÇ Äڵ嵵 Å« ƲÀº ºñ½ÁÇÏ´Ù.
typedef
char * va_list;
#define
_INTSIZEOF(n) ( (sizeof(n) +
sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define
va_start(ap,v) ( ap =
(va_list)&v + _INTSIZEOF(v) )
#define
va_arg(ap,t) ( *(t
*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define
va_end(ap)
( ap = (va_list)0 )
va_list´Â char * ŸÀÔÀ¸·Î
Á¤ÀǵǾî Àִµ¥ Áõ°¨ÇÒ ¶§ 1¹ÙÀÌÆ®¾¿ À̵¿Çϱâ À§ÇؼÀÌ´Ù. _INTSIZEOF(n)
¸ÅÅ©·Î´Â n ŸÀÔÀÇ ±æÀ̸¦ °è»êÇÑ´Ù. ¿¬»ê½ÄÀ»
Àß ºÐ¼®ÇØ º¸¸é Àǹ̸¦ Çؼ®ÇÒ ¼ö ÀÖÁö¸¸ ±×º¸´Ù´Â ÀÌ ¸ÅÅ©·Î¸¦ È£ÃâÇÏ¿© °¢ ŸÀÔÀÇ ±æÀ̸¦ ½ÇÁ¦·Î Âï¾î º¸´Â °ÍÀÌ ´õ Á÷°üÀûÀÌ´Ù.
printf("char = %d\n",_INTSIZEOF(char));
printf("short =
%d\n",_INTSIZEOF(short));
printf("int = %d\n",_INTSIZEOF(int));
printf("float =
%d\n",_INTSIZEOF(float));
printf("double =
%d\n",_INTSIZEOF(double));
°á°ú´Â 4, 4, 4, 4, 8ÀÌ´Ù.
ÀÌ ¸ÅÅ©·Î´Â ŸÀÔÀÇ Å©±â¸¦ 4ÀÇ ¹è¼ö·Î ¿Ã¸²Çϴµ¥ Á¤È®ÇÏ°Ô´Â Á¤¼öÇü Å©±âÀÇ ¹è¼ö·Î ¸ÂÃá´Ù. Á¤¼öÇüÀÇ Å©±â´Â ½Ã½ºÅÛ¸¶´Ù ´Ù¸£¸ç ÀÌ Å©±â´Â °ð ½ºÅà ÇÑÄÀÇ Å©±âÀÌ´Ù. °á±¹
ÀÌ ¸ÅÅ©·Î´Â °¢ ŸÀÔÀÌ ½ºÅÃÀ¸·Î Àü´ÞµÉ ¶§ ¸î ÄÀ» Â÷ÁöÇÏ´ÂÁö °è»êÇÑ´Ù. ´Ü¼øÇÑ °è»êÀÌ ¾Æ´Ï¶ó Ç÷§Æû¿¡
µû¸¥ ½ºÅà ũ±â³ª À̽ļº±îÁö °í·ÁÇÏ¿© Á¤¹ÐÇÏ°Ô °è»êÇÑ´Ù. char, short´Â Àμö·Î Àü´ÞµÉ ¶§ Ç×»ó intÇüÀ¸·Î È®ÀåµÇ¹Ç·Î ½ºÅÃÀÇ 4¹ÙÀÌÆ®¸¦ Â÷ÁöÇÑ´Ù.
va_start ¸ÅÅ©·Î´Â ap Æ÷ÀÎÅ͸¦
ù ¹ø° °¡º¯ Àμö ÀÚ¸®¿¡ ¸ÂÃá´Ù. ¸¶Áö¸· °íÁ¤ Àμö vÀÇ
¹øÁö¿¡ vÀÇ Å©±â¸¦ ´õÇÑ À§Ä¡¿¡¼ °¡º¯ Àμö°¡ ½ÃÀ۵ȴÙ. Àμö´Â
½ºÅÿ¡ ¿ª¼øÀ¸·Î µé¾î°¡¹Ç·Î °¡º¯ Àμö°¡ ¸ÕÀú(³ôÀº ¹øÁö) µé¾î°¡°í
°íÁ¤ Àμö°¡ Á¦ÀÏ ³¡(³·Àº ¹øÁö)¿¡ µé¾î°£´Ù. °¡º¯ Àμö ÇÔ¼ö°¡ È£ÃâµÈ Á÷ÈÄÀÇ ½ºÅÃÀº ´ÙÀ½°ú °°´Ù.
°íÁ¤ ÀμöÀÇ ¹øÁö &v¿¡¼ °íÁ¤ ÀμöÀÇ ±æÀ̸¸Å ´õÇÏ¸é ¹Ù·Î
¾Æ·¡¿¡ Àִ ù ¹ø° °¡º¯ ÀμöÀÇ ¹øÁö°¡ µÈ´Ù. va_start´Â ÀÌ ¿¬»êÀ» ÅëÇØ ap¸¦ °¡º¯ ÀμöÀÇ ½ÃÀÛ ¹øÁö¿¡ ¸ÂÃß¾î ÀÌÈÄÀÇ Àμö¸¦ ÀÐÀ» Áغñ¸¦ ÇÑ´Ù. ÀÌÁ¦ ap¿¡ ÀÖ´Â °ªÀ» ¼ø¼´ë·Î ÀÐÀ¸¸é µÇ´Âµ¥ ÀÌ µ¿ÀÛÀº va_arg°¡
´ã´çÇÑ´Ù.
va_arg´Â ap¸¦ °¡º¯
Àμö ±æÀ̸¸Å ´õÇØ ´ÙÀ½ Àμö·Î À̵¿ÇÑ´Ù. ±×¸®°í ´Ù½Ã ±æÀ̸¦ »© ¿ø·¡ ÀÚ¸®·Î µ¹¾Æ¿Â ÈÄ t ŸÀÔÀÇ Æ÷ÀÎÅͷΠij½ºÆÃÇÏ¿© * ¿¬»êÀÚ·Î Àд´Ù. va_arg´Â À̵¿ °Å¸®¿Í ÀÐÀ» ±æÀ̸¦ °è»êÇϱâ À§ÇØ °¡º¯ ÀμöÀÇ Å¸ÀÔÀÎ t¸¦
ÂüÁ¶ÇÑ´Ù. ´õÇß´Ù°¡ ´Ù½Ã »©´Â ÀÌÀ¯´Â °ªÀ» Àд µ¿ÀÛ°ú ´ÙÀ½ Àμö ¿ìÄ¡·Î À̵¿ÇÏ´Â µ¿ÀÛÀ» Çѹø¿¡ ó¸®Çϱâ
À§ÇؼÀÌ´Ù.
Áß°£ º¯¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í ÇÑ ÁÙÀÇ ¸ÅÅ©·Î·Î µÎ µ¿ÀÛÀ» Çѹø¿¡ ó¸®Çϱâ À§ÇØ ´Ù¼Ò º¹ÀâÇÏ°Ô µÇ¾î ÀÖ´Ù. ¿¬»ê ¼ø¼¿¡ µû¶ó ºÐ¼®ÇØ º¸ÀÚ.
ÀÌ È£Ãâ¿¡ ÀÇÇØ ap ¹øÁöÀÇ °¡º¯ Àμö¸¦ tŸÀÔÀ¸·Î Àаí ap´Â ´ÙÀ½ °¡º¯ Àμö À§Ä¡·Î À̵¿ÇÑ´Ù. ÀÌ ¸ÅÅ©·ÎÀÇ µ¿ÀÛÀ» Àß°Ô ºÐÇÒÇÏ¿© ÇÔ¼ö·Î Á¤ÀÇÇÒ ¼öµµ ÀÖ´Ù.
ret = *(t *)ap;
ap += _INTSIZEOF(t);
return ret;
¸ÕÀú Àаí ap¸¦ À̵¿½ÃŲ ÈÄ ÀÐÀº °ªÀ» ¸®ÅÏÇÑ´Ù. ¼³¸íÀ» À§ÇØ Ç®¾î ³õ¾ÒÁö¸¸ ½ÇÁ¦·Î´Â ÀÌ·± Äڵ带 ÀÛ¼ºÇÒ ¼ö ¾ø´Ù. Áö¿ª
º¯¼ö´Â ºí·Ï ¹üÀ§ º¯¼ö·Î »ý¼ºÇÒ ¼ö ÀÖÁö¸¸ ¸®ÅÏ°ªÀ» °¡º¯ÀûÀ¸·Î °áÁ¤ÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼ ÀÌ
¼¼ µ¿ÀÛÀ» ¸ÅÅ©·Î ±¸¹®À¸·Î Àý¹¦ÇÏ°Ô ±¸°Ü ³ÖÀº °ÍÀÌ ¹Ù·Î va_argÀÌ´Ù. µü ÇÑ ÁÙÀÌÁö¸¸ °¡È÷ ¿¹¼úÀûÀÎ ÄÚµåÀÌ´Ù.
¸¶Áö¸·À¸·Î va_end´Â ap Æ÷ÀÎÅ͸¦ NULL·Î ¸¸µé¾î ¹«È¿È½ÃÅ°°í Á¤¸®ÇÑ´Ù. »ç½Ç ap´Â Áö¿ª º¯¼öÀÌ°í ÇÔ¼ö°¡ Á¾·áµÇ¸é »ç¶óÁö¹Ç·Î ±»ÀÌ Á¤¸®ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç ½ÇÁ¦·Î va_end¸¦ »©µµ Àß µ¿ÀÛÇÑ´Ù. va_end´Â ¹Ì·¡ÀÇ Ç÷§Æû¿¡¼
´Ù¸¥ ¹æ¹ýÀ¸·Î °¡º¯ Àμö¸¦ ±¸ÇöÇÒ ¶§ µÞÁ¤¸® À§Ä¡¸¦ È®º¸ÇØ ³õ´Â °Í »ÓÀÌ´Ù. °¡º¯ Àμö ÇÔ¼öÀÇ ¿¹Á¦·Î
ÀÛ¼ºÇß´ø GetSum ÇÔ¼ö¸¦ ¸ÅÅ©·Î¸¦ ¾²Áö ¾Ê°í Àü°³Çؼ ´Ù½Ã ÀÛ¼ºÇØ º¸ÀÚ.
int GetSum(int num, ...)
{
int
sum=0;
int
i;
//
va_list ap;
char
*ap;
int
arg;
//
va_start(ap,num);
ap=(char
*)&num+sizeof(num);
for
(i=0;i<num;i++) {
//
arg=va_arg(ap,int);
arg=*(int
*)ap;
ap+=sizeof(int);
sum+=arg;
}
//
va_end(ap);
return
sum;
}
Á» ±æ¾îÁ³À» »Ó µ¿ÀÛÀº ¿ÏÀüÈ÷ °°´Ù. °¡º¯ Àμö ÇÔ¼ö´Â Æ÷ÀÎÅÍ ¿¬»ê, sizeof, ij½ºÆ® ¿¬»êÀÚÀÇ Á¶ÇÕ¿¡ ÀÇÇØ ±¸ÇöµÈ´Ù. ÀÌ º¹ÀâÇÑ
µ¿ÀÛÀ» ¾²±â ½±°í À̽ļºÀ» È®º¸ÇÒ ¼ö ÀÖµµ·Ï Àß Á¤¸®ÇØ ³õÀº °ÍÀÌ ¹Ù·Î va_ ¸ÅÅ©·ÎÀÌ´Ù.
°¡º¯ Àμö ÇÔ¼ö´Â ÇѹøÀÇ È£Ãâ·Î ¿©·¯ °³ÀÇ Á¤º¸¸¦ ÇѲ¨¹ø¿¡ ´Ù·ê ¼ö ÀÖ¾î ¹«Ã´ Æí¸®ÇÏ´Ù. ƯÈ÷ printf ÇÔ¼ö´Â ±¸´Ú´Ù¸® °°¾Æ º¸¿©µµ ¿©·¯ º¯¼ö¸¦ ´Ü ÇÑÁÙ·Î
È®ÀÎÇÒ ¼ö ÀÖ¾î ¾ÆÁ÷µµ À̸¸ÇÑ Ãâ·Â ÇÔ¼ö°¡ ¾øÀ¸¸ç ÃֽŠ¾ð¾î(ÀÚ¹Ù,
C#)µµ ´Ù ¸ð¹æÇÒ Á¤µµÀÌ´Ù.
±×¸¸Å ÀÌ ÇÔ¼ö°¡ Àß ¸¸µé¾îÁ³°í ½Ã´ë¸¦ ÃÊ¿ùÇÒ Á¤µµ·Î ½Ç¿ëÀûÀ̶ó´Â ¾ê±â´Ù.
printf¿Í À¯»çÇÑ ÇÔ¼ö¸¦ Á÷Á¢ ¸¸µé·Á¸é ¼½ÄÀ» Á¤ÀÇÇÏ°í ¼½Ä¿¡ ´ëÀÀµÇ´Â Àμö¸¦ Àд º¹ÀâÇÑ Äڵ带 ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ´ÙÇàÈ÷ ÀÌ·± ÀÏÀ» ´ë½ÅÇØ ÁÖ´Â ÇÔ¼ö°¡ ÁغñµÇ¾î ÀÖ´Ù.
int vprintf( const char *format, va_list argptr );
int vsprintf( char *buffer, const char *format,
va_list argptr );
ÀÌ ¿Ü¿¡µµ vscanf, vsscanf µîÀÇ ÀÔ·Â ÇÔ¼öµµ Àִµ¥ ÀÌ·±
ÇÔ¼ö¸¦ v°è¿(Variable)À̶ó°í ºÎ¸¥´Ù. À§ µÎ ÇÔ¼ö´Â printf, sprintf ÇÔ¼ö¿Í µ¿ÀÏÇÑ ±â´ÉÀ»
¼öÇàÇ쵂 °¡º¯ Àμö¸¦ Á÷Á¢ ³ª¿ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó °¡º¯ Àμö°¡ ½ÃÀ۵Ǵ ¹øÁö¸¦ Àμö·Î ÃëÇÑ´Ù.
½ÇÁ¦·Î °¡º¯ Àμö¸¦ ÃëÇÏÁö ¾Ê°í °¡º¯ Àμö¸¦ ¹ÞÀº ´Ù¸¥ ÇÔ¼öÀÇ ³»ºÎ¿¡¼
printfÀÇ ¼½ÄÀ» Çؼ®ÇÏ°í Àû¿ëÇÏ´Â ÀÏÀ» ´ë½ÅÇÑ´Ù. ÀÌ µÎ ÇÔ¼ö¸¦ »ç¿ëÇϸé printfó·³ µ¿ÀÛÇÏ´Â ºñ½ÁÇÑ ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù. ´ÙÀ½ ÇÔ¼ö´Â
½ÇÇàÁß¿¡ º¯¼ö°ªÀ» µð¹ö°Å·Î Ãâ·ÂÇÑ´Ù.
void CustomTrace(char *format, ...)
{
char
buf[1024];
va_list
marker;
va_start(marker,
format);
vsprintf(buf,
format, marker);
OutputDebugString(buf);
}
va_start·Î ù ¹ø° °¡º¯ ÀμöÀÇ ¹øÁö marker¸¦ ±¸ÇÑ ÈÄ ±× ¹øÁö¸¦ ¼½Ä ¹®ÀÚ¿°ú ÇÔ²² vsprintf·Î
³Ñ±ä´Ù. vsprintf´Â ¼½Ä ¹®ÀÚ¿ÀÇ ¼½Ä°ú marker À§Ä¡ÀÇ
°¡º¯ Àμö¸¦ Á¶¸³ÇÏ¿© ȸéÀÌ ¾Æ´Ñ buf ¹®ÀÚ¿·Î Ãâ·ÂÇÑ´Ù. ÀÌ·¸°Ô
Á¶¸³µÈ ¹®ÀÚ¿À» OutputDebugString ÇÔ¼ö·Î Àü´ÞÇϸé ÄÄÆÄÀÏ·¯ÀÇ µð¹ö±ëâ¿¡ ³ªÅ¸³´Ù. ½ÇÇàÁß¿¡ º¯¼ö°ªÀ» È®ÀÎÇϰųª ÇÔ¼öÀÇ È£Ãâ ½ÃÁ¡, ȸ¼ö µîÀ» ¾Ë°í
½ÍÀ» ¶§ ÀÌ ÇÔ¼ö¸¦ Áß°£ Áß°£¿¡ »ðÀÔÇØ µÐ´Ù.
CustomTrace("º¯¼ö a=%d,
º¯¼ö f=%f\n",a,f);
CustomTrace("ÇÔ¼ö func°¡ %d¹ø° È£ÃâµÇ¾úÀ½",count++);
ÇÑÁÙ·Î °£ÆíÇÏ°Ô °ü½É º¯¼öÀÇ ¸ñ·ÏÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ°í ´Ü¼ø ¹®ÀÚ¿ »Ó¸¸ ¾Æ´Ï¶ó ´Ù¾çÇÑ Å¸ÀÔÀÇ º¯¼ö°ªÀ» ¿øÇÏ´Â ÇüÅ·Î
Á¶¸³ÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù. ÀÌ ÇÔ¼ö¸¦ ´õ °³¼±ÇÏ¿© Á¶¸³ÇÑ ¹®ÀÚ¿À» ÆÄÀÏ·Î Ãâ·ÂÇϸé ÇÁ·Î±×·¥ ½ÇÇà °úÁ¤À»
¼¼¼¼ÇÏ°Ô ·Î±×·Î ³²±â´Â ÅؽºÆ® µð¹ö±ëÀÌ °¡´ÉÇØÁø´Ù. ¸ðµç °ÍÀ» ±â·ÏÇØ ³õ°í ³ªÁß¿¡ õõÈ÷ »ìÆ캸´Â ÀÛÀüÀÌ´Ù.
¿©·¯ ½º·¹µå°¡ µ¿½Ã¿¡ ½ÇÇàµÇ´Â ¸ÖƼ ½º·¹µå ȯ°æÀ̳ª ¿î¿µÃ¼Á¦ ºÎÆà Àü¿¡ ½ÇÇàµÇ´Â µð¹ÙÀ̽º µå¶óÀ̹ö, ¼ºñ½º µîÀº ÄÄÆÄÀÏ·¯ÀÇ ´Ü°è ½ÇÇàÀ¸·Î´Â ¹®Á¦¸¦ ¹ß°ßÇϱ⠽±Áö ¾Ê´Ù. ÀÌ·²
¶§ ±Ã±ØÀÇ µð¹ö±ë ¹æ¹ýÀ¸·Î »ç¿ëµÇ´Â °ÍÀÌ ¹Ù·Î ÅؽºÆ® µð¹ö±ëÀÌ´Ù.