3.°¡º¯ Àμö

1.°¡º¯ Àμö ÇÔ¼ö

°¡º¯ Àμö´Â ÀμöÀÇ °³¼ö¿Í ŸÀÔÀÌ °íÁ¤ÀûÀ¸·Î Á¤ÇØÁ® ÀÖÁö ¾Ê´Ù´Â ¶æÀ̸ç ÀÓÀÇ Å¸ÀÔÀÇ Àμö¸¦ ÀÓÀÇ °³¼ö¸¸Å­ ¹Þ´Â´Ù. ¿©±â¼­´Â ÀÌ·± ÇÔ¼ö¸¦ ¸¸µå´Â ¹æ¹ý°ú ¿ø¸®¿¡ ´ëÇØ ¿¬±¸ÇØ º¸ÀÚ. Æ÷ÀÎÅÍ ¿¬»êÀÌ ¸¹°í º¹ÀâÇØ ¾î·ÆÁö¸¸ Æ÷ÀÎÅ͸¦ °¡Àå Àß ÀÀ¿ëÇÑ ¿¹¸¦ »ìÆ캼 ¼ö ÀÖ´Ù. °¡º¯ Àμö¸¦ Á¦´ë·Î ÀÌÇØÇÏ·Á¸é Æ÷ÀÎÅÍ¿¡ ´ëÇÑ À̷аú ½ºÅà ÇÁ·¹ÀÓÀÇ ±¸Á¶¸¦ Àß ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù.

°¡º¯ Àμö ÇÔ¼ö´Â ±²ÀåÈ÷ º¹ÀâÇÑ ±¸Á¶¸¦ °¡Áö°í ÀÖÁö¸¸ ¿ª¼³ÀûÀÌ°Ôµµ 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À» ¸®ÅÏÇÑ´Ù. °¡º¯ Àμö ÇÔ¼ö´Â ±¸Á¶°¡ °ÅÀÇ ºñ½ÁÇϹǷΠÀÌ ÇÔ¼ö¸¦ µû¶óÇÏ¸é ½±°Ô ¸¸µé ¼ö ÀÖ´Ù.

2.°¡º¯ Àμö ÇÔ¼öÀÇ Á¶°Ç

°¡º¯ Àμö ÇÔ¼ö°¡ Àμö¿¡ ´ëÇÑ Á¦¾àÀÌ ´ú ÇÏ´Ù°í Çؼ­ ¾Æ¹« Àμö³ª ¸¶À½´ë·Î Àü´ÞÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. °¡º¯ÀÌ´õ¶óµµ ÁöÄÑ¾ß ÇÒ ±ÔÄ¢ÀÌ ÀÖ´Ù.

 

- óÀ½ºÎÅÍ °¡º¯ Àμö°¡ ¿Ã ¼ö´Â ¾øÀ¸¸ç Çϳª ÀÌ»óÀÇ °íÁ¤ Àμö°¡ ÀÖ¾î¾ß ÇÑ´Ù. ù ¹ø° °¡º¯ Àμö´Â °íÁ¤ Àμö ¹Ù·Î ´ÙÀ½¿¡ ¿À´Âµ¥ ÀÌ À§Ä¡¸¦ ã±â À§ÇØ °íÁ¤ ÀμöÀÇ À§Ä¡¸¦ ÂüÁ¶ÇÑ´Ù. °íÁ¤µÈ Àμö°¡ ¾øÀ¸¸é ½ºÅÃÀ» Á÷Á¢ µÚÁ®¾ß ÇÏ´Ï ¾î·Æ°í À̽ļºÀ» È®º¸Çϱ⵵ ¾î·Æ´Ù. 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 ¿¬»êÀÚ¿Í Ä³½ºÆ® ¿¬»êÀÚ¿¡ »ç¿ëµÇ±â ¶§¹®ÀÌ´Ù. Àá½Ã ÈÄ ³»ºÎ Äڵ带 ºÐ¼®ÇØ º¸ÀÚ.

 

°¡º¯ Àμö ÇÔ¼ö¸¦ ¸¸µå´Â ±ÔÄ¢À» °£´ÜÈ÷ ¿ä¾àÇÏ¸é ¸¶À½´ë·Î Àμö¸¦ Àü´ÞÇ쵂 ¾î¶² Àμö¸¦ ¸î °³³ª Àü´ÞÇß´ÂÁö ÇÔ¼ö¿¡°Ô Á¤º¸¸¦ Á¦°øÇØ¾ß ÇÑ´Ù. ÀÌ ±ÔÄ¢¸¸ ÁöŲ´Ù¸é Àμö¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë·Á ÁÖ´Â ¹æ¹ýÀº ÀÚÀ¯·Ó°Ô ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.

°¡º¯ Àμö ÇÔ¼ö´Â È£ÃâÃø¿¡¼­ ÇÊ¿äÇѸ¸Å­ Àμö¸¦ Àü´ÞÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù. ±×·¯³ª ÀÚÀ¯¿¡´Â ¾ðÁ¦³ª Ã¥ÀÓÀÌ µû¸£´Â ¹ýÀ̶ó ±ÔÄ¢À» Á¦´ë·Î ÁöÅ°Áö ¾ÊÀ¸¸é ¾î¶² °á°ú°¡ ¹ß»ýÇÒÁö Àå´ãÇÒ ¼ö ¾ø´Ù. °¡º¯ Àμö ÇÔ¼ö¸¦ À߸ø È£ÃâÇßÀ» ¶§ ¾î¶»°Ô µÇ´ÂÁö ´ÙÀ½ ¿¹Á¦·Î ½ÇÇèÇØ º¸ÀÚ.

 

#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 ÇÔ¼öÀÇ ¿øÇü¿¡ ...À̶ó°í µÇ¾î ÀÖ¾î Àμö¿¡ ´ëÇØ ¾î¶°ÇÑ °£¼·µµ ÇÏÁö ¸»¶ó°í Ç߱⠶§¹®ÀÌ´Ù. ÄÄÆÄÀÏ·¯´Â À§ Äڵ尡 À§ÇèÇÑÁö ¾Æ´ÑÁö ÆǺ°ÇÒ ´É·Âµµ ±ÇÇѵµ ¾ø´Ù. ±×·¡¼­ °¡º¯ Àμö´Â ÃæºÐÈ÷ ÁÖÀǸ¦ ±â¿ï¿© »ç¿ëÇØ¾ß ÇÑ´Ù.

3.¸ÅÅ©·Î ºÐ¼®

°¡º¯ Àμö ÇÔ¼öÀÇ È°¿ë°ú Á¦ÀÛ¸¸À» ¸ñÀûÀ¸·Î ÇÑ´Ù¸é ¿©±â±îÁö¸¸ ÀÌÇØÇصµ ÃæºÐÇÏ´Ù. ±×·¯³ª °¡º¯ Àμö°¡ ¾î¶² ½ÄÀ¸·Î µ¿ÀÛÇÏ´ÂÁö È£±â½ÉÀÌ ¹ßµ¿ÇÑ´Ù¸é 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_ ¸ÅÅ©·ÎÀÌ´Ù.

4.°¡º¯ ÀμöÀÇ È°¿ë

°¡º¯ Àμö ÇÔ¼ö´Â ÇѹøÀÇ È£Ãâ·Î ¿©·¯ °³ÀÇ Á¤º¸¸¦ ÇѲ¨¹ø¿¡ ´Ù·ê ¼ö ÀÖ¾î ¹«Ã´ Æí¸®ÇÏ´Ù. ƯÈ÷ 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++);

 

ÇÑÁÙ·Î °£ÆíÇÏ°Ô °ü½É º¯¼öÀÇ ¸ñ·ÏÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ°í ´Ü¼ø ¹®ÀÚ¿­ »Ó¸¸ ¾Æ´Ï¶ó ´Ù¾çÇÑ Å¸ÀÔÀÇ º¯¼ö°ªÀ» ¿øÇÏ´Â ÇüÅ·ΠÁ¶¸³ÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏ´Ù. ÀÌ ÇÔ¼ö¸¦ ´õ °³¼±ÇÏ¿© Á¶¸³ÇÑ ¹®ÀÚ¿­À» ÆÄÀÏ·Î Ãâ·ÂÇϸé ÇÁ·Î±×·¥ ½ÇÇà °úÁ¤À» ¼¼¼¼ÇÏ°Ô ·Î±×·Î ³²±â´Â ÅؽºÆ® µð¹ö±ëÀÌ °¡´ÉÇØÁø´Ù. ¸ðµç °ÍÀ» ±â·ÏÇØ ³õ°í ³ªÁß¿¡ õõÈ÷ »ìÆ캸´Â ÀÛÀüÀÌ´Ù.

¿©·¯ ½º·¹µå°¡ µ¿½Ã¿¡ ½ÇÇàµÇ´Â ¸ÖƼ ½º·¹µå ȯ°æÀ̳ª ¿î¿µÃ¼Á¦ ºÎÆà Àü¿¡ ½ÇÇàµÇ´Â µð¹ÙÀ̽º µå¶óÀ̹ö, ¼­ºñ½º µîÀº ÄÄÆÄÀÏ·¯ÀÇ ´Ü°è ½ÇÇàÀ¸·Î´Â ¹®Á¦¸¦ ¹ß°ßÇϱ⠽±Áö ¾Ê´Ù. ÀÌ·² ¶§ ±Ã±ØÀÇ µð¹ö±ë ¹æ¹ýÀ¸·Î »ç¿ëµÇ´Â °ÍÀÌ ¹Ù·Î ÅؽºÆ® µð¹ö±ëÀÌ´Ù.