16-1-¶ó.È£Ãâ ±Ô¾à ºÒÀÏÄ¡

ÄÄÆÄÀÏ·¯´Â ÇÔ¼öÀÇ È£Ã⠱Ծ࿡ ¸Â°Ô ½ºÅà ÇÁ·¹ÀÓÀ» ÀÛ¼ºÇÏ°í °ü¸®ÇÑ´Ù. __cdeclÀ» ¾²¸é ÀÌ ±Ô¾à¿¡ ¸Â°Ô È£Ãâ¿øÀÌ ½ºÅÃÀ» Á¤¸®Çϵµ·Ï ÄÄÆÄÀÏÇÒ °ÍÀ̸ç __stdcallÀ» ¾²¸é ÇÔ¼ö°¡ ½ºÅÃÀ» Á¤¸®Çϵµ·Ï ÄÄÆÄÀÏÇÒ °ÍÀÌ´Ù. È£Ã⠱Ծ࿡ µû¶ó ³»ºÎ Äڵ尡 ¾à°£ ´Þ¶óÁö°í ¹«½ÃÇØµµ ÁÁÀ» Á¤µµÀÇ ¹Ì¼¼ÇÑ ¼Óµµ, Å©±â Â÷À̰¡ ¹ß»ýÇÏÁö¸¸ ½ÇÇà °á°ú´Â µ¿ÀÏÇÏ´Ù.

±×·¡¼­ ÇÔ¼öÀÇ È£Ãâ ±Ô¾àÀ» ¾î¶² °ÍÀ¸·Î ¾µ °ÍÀΰ¡´Â °í¹ÎÇÒ¸¸ÇÑ ¹®Á¦°¡ ¾Æ´Ï´Ù. ÄÄÆÄÀÏ·¯°¡ ÁöÁ¤ÇÑ È£Ãâ ±Ô¾à´ë·Î ÇÔ¼ö¸¦ ÄÄÆÄÀÏÇϰí ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÀûÇÕÇÑ Äڵ嵵 °°ÀÌ ¸¸µé±â ¶§¹®ÀÌ´Ù. ±×·¯³ª ¾ÆÁÖ Æ¯¼öÇÑ °æ¿ì È£Ãâ¿ø°ú ÇÔ¼öÀÇ È£Ãâ ±Ô¾àÀÌ ´Þ¶óÁú ¼öµµ ÀÖ´Ù. ¾î¶² ¶§ ÀÌ·± ºÒÀÏÄ¡°¡ ¹ß»ýÇÒ ¼ö Àִ°¡ Çϸé ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ ¾ð¾î¿Í È£ÃâÇÏ´Â ¾ð¾î°¡ ´Ù¸¦¶§, ºÐ¸®µÈ DLL¿¡ ÀÖ´Â ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§, ¿øÇüÀÌ ÀÌ¹Ì Á¤ÇØÁ® ÀÖ´Â ÄݹéÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ µîÀÌ´Ù.

ÇÔ¼ö¸¦ C/C++·Î ÀÛ¼ºÇß°í ºÎ¸£´Â Âʵµ C/C++ÀÌ¸ç °°Àº ¸ðµâ ³»¿¡¼­ È£ÃâÇÑ´Ù¸é ÀÌ·± ºÒÀÏÄ¡°¡ ¹ß»ýÇÒ ¸®°¡ ¾ø´Ù. ÇÔ¼öÀÇ È£Ãâ ±Ô¾à°ú ´Ù¸£°Ô ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾î¶»°Ô µÇ´ÂÁö ½ÇÇèÀ» ÇØ º¸ÀÚ. Á¤»óÀûÀÎ ¹®¹ýÀ¸·Î ÇÑ ¿¹Á¦¿¡¼­ ÀÌ·± »óȲÀ» ¸¸µé±â´Â ¹«Ã´ ¾î·Á¿îµ¥ ¿Ö³ÄÇϸé ÇÔ¼öÀÇ È£Ãâ ±Ô¾àÀ» ¹Ù²Ù¸é È£ÃâÇÏ´Â ÂÊÀÇ Äڵ嵵 °°ÀÌ ¹Ù²î±â ¶§¹®ÀÌ´Ù. ÀÌ·± »óȲÀ» ¾ïÁö·Î¶óµµ ¸¸µé¾î º¸·Á¸é ÇÔ¼ö Æ÷ÀÎÅͷΠȣÃâ ±Ô¾àÀ» ´Ù¸£°Ô ¸¸µé¾î ³õ°í °­Á¦ È£ÃâÇÏ¸é µÈ´Ù.

 

¿¹ Á¦ : WrongCall

#include <Turboc.h>

 

int __cdecl Add(int a, int b)

{

     int c,d,e;

     c=a+b;

     return c;

}

 

void main()

{

     int result;

     int (__stdcall *pf)(int,int);

     pf=(int (__stdcall *)(int,int))Add;

     result=pf(1,2);

     printf("result = %d\n",result);

}

 

Add ÇÔ¼ö´Â __cdecl·Î ¼±¾ðµÇ¾úÀ¸¸ç ÀÌ È£Ãâ ±Ô¾àÀº È£Ãâ¿øÀÌ ½ºÅÃÀ» Á¤¸®Çϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î ÀÚ½ÅÀÌ ½ºÅÃÀ» Á¤¸®ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. main¿¡¼­´Â Add¸¦ ¹Ù·Î È£ÃâÇÏÁö ¾Ê°í __stdcall È£Ãâ ±Ô¾àÀ» »ç¿ëÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅÍ pf·Î °­Á¦ ´ëÀÔÇÑ ÈÄ È£ÃâÇß´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ´Â ÇÔ¼ö¸¦ È£ÃâÇϱâ À§ÇÑ ¸ðµç Á¤º¸¸¦ °¡Áö°í ÀÖ¾î¾ß ÇϹǷΠȣÃ⠱Ծ࿡ ´ëÇÑ ÁöÁ¤µµ °¡Áú ¼ö ÀÖ´Ù. ´Ü¼øÈ÷ pf=Add¶ó°í ´ëÀÔÇϸé ÇÔ¼ö¿Í ÇÔ¼ö Æ÷ÀÎÅÍÀÇ È£Ãâ ±Ô¾àÀÌ ¸ÂÁö ¾Ê¾Æ, Áï ŸÀÔÀÌ ´Þ¶ó ´ëÀÔµÇÁö ¾ÊÀ¸¹Ç·Î ¿¡·¯·Î 󸮵ȴÙ. °­Á¦·Î ij½ºÆÃÇØ¼­ ´ëÀÔÇϸé ÀÏ´Ü ÄÄÆÄÀϵȴÙ.

pf´Â __stdcall È£Ãâ ±Ô¾àÀ» ¾²´Â ÇÔ¼ö¿¡ ´ëÇÑ ÇÔ¼ö Æ÷ÀÎÅÍÀ̹ǷΠÀÌ Æ÷ÀÎÅÍ·Î ÇÔ¼ö¸¦ È£ÃâÇϸé mainÀº ½ºÅÃÀ» Á¤¸®ÇÏÁö ¾Ê´Â´Ù. ÄÄÆÄÀÏ·¯´Â pf(1,2)È£Ãâ¿¡ ´ëÇØ ½ºÅà Á¤¸® Äڵ带 ÀÛ¼ºÇÏÁö ¾Ê´Âµ¥ ¿Ö³ÄÇϸé pf°¡ °¡¸®Å°´Â ÇÔ¼ö´Â ½º½º·Î ½ºÅÃÀ» Á¤¸®ÇÑ´Ù°í »ý°¢Çϱ⠶§¹®ÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é Àμö°¡ Àü´ÞµÇ±â´Â ÇÏÁö¸¸ ¾Æ¹«µµ ½ºÅÃÀ» Á¤¸®ÇÏÁö ¾Ê±â ¶§¹®¿¡ Add°¡ ¸®ÅÏµÈ Á÷ÈÄ ½ºÅÃÀº ¿ø·¡ »óÅ·Πº¹±¸µÇÁö ¾Ê´Â´Ù.

½ºÅÿ¡ ÀúÀåµÇ´Â Á¤º¸µéÀº º¸Åë ¾ÆÁÖ Áß¿äÇÑ Á¤º¸µéÀ̸ç ÀÌ Á¤º¸°¡ ¼Õ»óµÇ¸é ÇÁ·Î±×·¥ÀÇ µ¿ÀÛÀº ¿¹ÃøÇÒ ¼ö ¾ø´Ù. ½ºÅà Æ÷ÀÎÅ͸¦ ÀÒ¾î¹ö¸° ÇÁ·Î±×·¥Àº ¾û¶×ÇÑ °ªÀ» ·¹Áö½ºÅÍ¿¡ ´ëÀÔÇϰųª º¹±Í ¹øÁö¸¦ À߸ø ã¾Æ ÀÓÀÇÀÇ ¸Þ¸ð¸® ¹øÁö·Î Á¡ÇÁÇÏ¿© ÆøÁÖÇØ ¹ö¸°´Ù. °á±¹ ÀÌ ÇÁ·Î±×·¥Àº Add°¡ ¸®ÅϵǴ Áï½Ã ´Ù¿îµÉ È®·üÀÌ 99.9629%³ª µÈ´Ù.

À̹ø¿¡´Â ¹Ý´ëÀÇ °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ. Add ÇÔ¼ö¸¦ __stdcall È£Ãâ ±Ô¾àÀ¸·Î ÀÛ¼ºÇϰí main¿¡¼­ pf¸¦ __cdecl È£Ãâ ±Ô¾àÀ» ¾²´Â ÇÔ¼ö Æ÷ÀÎÅÍ·Î ¼±¾ðÇÑ ÈÄ pf·Î Add¸¦ È£ÃâÇÏ¸é ¾î¶»°Ô µÉ±î? ÀÌ °æ¿ì ½ºÅÃÀº ÀÌÁßÀ¸·Î Á¤¸®µÉ °ÍÀÌ°í ¸¶Âù°¡Áö·Î ½ºÅÃÀÌ ±úÁö±â ¶§¹®¿¡ ÀÌ ÇÁ·Î±×·¥µµ ¿ª½Ã ´Ù¿îµÈ´Ù. ½ºÅÃÀº Ç×»ó¼ºÀ» À¯ÁöÇØ¾ß ÇÑ´Ù´Â ´ë¿øÄ¢À» ¾î°å±â ¶§¹®ÀÌ´Ù.

ÀÌ ¿¹Á¦°¡ ´Ù¿îµÇ´Â ÀÌÀ¯´Â ŸÀÔÀÌ ¸ÂÁö ¾ÊÀº ÇÔ¼ö Æ÷ÀÎÅ͸¦ »ç¿ëÇ߱⠶§¹®Àε¥ ±×·¡¼­ ÄÄÆÄÀÏ·¯´Â pf=Add È£Ãâ¹®¿¡ ´ëÇØ ¿¡·¯ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇϰí ÄÄÆÄÀÏÀ» °ÅºÎÇÏ´Â °ÍÀÌ´Ù. ÀÌ °ÅºÎ¸¦ ¹«½ÃÇϰí ij½ºÆ® ¿¬»êÀÚ·Î °­Á¦ ij½ºÆÃÀ» ÇßÀ¸¹Ç·Î °³¹ßÀÚ¿¡°Ô Ã¥ÀÓÀÌ ÀÖÀ¸¸ç ÄÄÆÄÀÏ·¯´Â ¾Æ¹« Á˰¡ ¾ø´Ù. ÄÄÆÄÀÏ·¯´Â ÀÌ ¿¹Á¦°¡ ´Ù¿îµÇ´Â »óȲÀ» º¸°í "°Å ºÁ! ³»°¡ ´ëÀÔÇÏÁö ¸»¶ó°í ÇßÀݾÆ"¶ó°í ºñ¿ô°í ÀÖÀ» Áöµµ ¸ð¸£°Ú´Ù. ±×·¯°í º¸¸é ÄÄÆÄÀÏ·¯°¡ Ãâ·ÂÇÏ´Â ¿¡·¯ ¸Þ½ÃÁöµéÀº ´Ù ÇÕ¸®ÀûÀÎ ÀÌÀ¯°¡ ÀÖ´Ù.

¾Õ ÀåÀÇ qsorttest¿¹Á¦¿¡µµ ÀÌ·± »óȲÀ» Å×½ºÆ®ÇÒ ¼ö Àִµ¥ compare ÇÔ¼öÀÇ ¿øÇüÀ» __stdcall·Î ¹Ù²Ù¸é ´çÀå ´Ù¿îµÇ¾î ¹ö¸± °ÍÀÌ´Ù. qsort°¡ ºñ±³ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÄÚµå´Â ÀÌ¹Ì ¶óÀ̺귯¸®¿¡ ÄÄÆÄÀÏµÈ ±â°è¾î ÄÚµå·Î µé¾î ÀÖÀ¸¸ç qsort´Â ºñ±³ ÇÔ¼ö°¡ __cdeclÀ̶ó°í ¾Ë°í ÀÖ´Ù. ±×·±µ¥ ´Ù¸¥ È£Ãâ ±Ô¾àÀ¸·Î ÇÔ¼ö¸¦ Á¦°øÇßÀ¸¹Ç·Î ´Ù¿îµÇ´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù.