¢Ê 10ÀÏ: ¿ÜºÎ¼±¾ð - ¿ÜºÎ¼±¾ð


¢¹ A10. ¿ÜºÎ¼±¾ð (External Declaration)
  C ÄÄÆÄÀÏ·¯·Î Á¦°øµÇ´Â ¼Ò½ºÀÇ ÀԷ´ÜÀ§ (unit of input) ¸¦ ¹ø¿ª´ÜÀ§ (translation unit) ¶ó°í ÇÕ´Ï´Ù. ¹ø¿ª´ÜÀ§´Â ¼±¾ð (declaration) À̳ª ÇÔ¼öÁ¤ÀÇ (function definition) ¸¦ ÀǹÌÇÏ´Â ¿ÜºÎ¼±¾ð (external declaration) ÀÇ ³ª¿­·Î ±¸¼ºµË´Ï´Ù.

translation-unit:
        external-declaration
        translation-unit   external-declaration

external-declaration:
        function-definition
        declaration

¢º ¿ªÀÚ ÁÖ
  ¹ø¿ª´ÜÀ§ (translation unit) ¶õ, ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ÀνĵǾî ÇϳªÀÇ ´ÜÀ§·Î ¹ø¿ªµÇ´Â ¼Ò½ºÆÄÀÏÀÇ ÁýÇÕÀ» ÀǹÌÇÕ´Ï´Ù. º¸Åë #include Áö½ÃÀÚ¿¡ ÀÇÇØ Æ÷ÇԵǴ ¸ðµç Çì´õÆÄÀÏÀ» ´õÇÑ, ÇϳªÀÇ .c ÆÄÀÏ (¼Ò½ºÆÄÀÏ) ÀÔ´Ï´Ù.

  ¿ÜºÎ¼±¾ðÀÇ Åë¿ë¹üÀ§´Â, ºí·°³»¿¡¼­ ¼±¾ðÀÇ È¿°ú°¡ ºí·°ÀÇ ³¡±îÁö Áö¼ÓµÇ´Â °Íó·³, ±×°ÍµéÀÌ ¼±¾ðµÇ´Â ¹ø¿ª´ÜÀ§ÀÇ ³¡±îÁö Áö¼ÓµË´Ï´Ù. ¿ÜºÎ¼±¾ðÀÇ ¹®¹ýÀº, ÇÔ¼öÀÇ Á¤Àǰ¡ ÀÌ ´Ü°è (level) ¿¡¼­¸¸ ÁÖ¾îÁú ¼ö ÀÖ´Ù´Â °ÍÀ» Á¦¿ÜÇÏ¸é ´Ù¸¥ ¸ðµç ¼±¾ð°ú µ¿ÀÏÇÕ´Ï´Ù.

  ¢¹ A10.1 ÇÔ¼öÁ¤ÀÇ (Function Definition)
  ÇÔ¼öÁ¤ÀÇ´Â ´ÙÀ½°ú °°Àº ÇüŸ¦ °®½À´Ï´Ù.

function-definition:
        declaration-specifiers opt   declarator
                                    declaration-list opt   compound-statement

¢º ¿ªÀÚ ÁÖ
  À§¿¡ Á¦½ÃµÈ ÇÔ¼öÁ¤ÀÇÀÇ ¹®¹ýÀº ¿ø¹®¿¡´Â ÇÑÁÙ·Î Á¦½ÃµÈ °ÍÀÔ´Ï´Ù. ¹®¹ýÀÌ ³Ê¹« ±æ¾î ÇÑ ÁÙ¿¡ ´Ù ³ÖÀ» ¼ö ¾ø¾î ºÎµæÀÌÇÏ°Ô µÎÁÙ·Î ³ª´²¼­ ¾¹´Ï´Ù.

¼±¾ð ÁöÁ¤ÀÚ (declaration specifier) ¿¡ Çã¶ôµÇ´Â À¯ÀÏÇÑ ±â¾ïºÎ·ù ÁöÁ¤ÀÚ´Â extern À̳ª static ÀÔ´Ï´Ù; µÎ ÁöÁ¤ÀÚÀÇ Â÷ÀÌÁ¡Àº A11.2 Àý¿¡¼­ ´Ù·ì´Ï´Ù.
  ÇÔ¼ö´Â, ÇÔ¼ö³ª ¹è¿­À» Á¦¿ÜÇÑ »ê¼úÇü, ±¸Á¶Ã¼, °ø¿ëü, Æ÷ÀÎÅÍ, void ÇüÀ» ¹ÝȯÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼ö¼±¾ðÀÇ ¼±¾ðÀÚ (declarator) ´Â ¼±¾ðµÇ´Â ¸íĪÀÌ ÇÔ¼öÇüÀÓÀ» ¸í¹éÈ÷ ÁöÁ¤ÇØÁà¾ß ÇÕ´Ï´Ù; µû¶ó¼­ ´ÙÀ½ ÇüÅÂÁß Çϳª¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÕ´Ï´Ù. (A8.6.3 Âü°í)

        direct-declarator ( parameter-type-list )
        direct-declarator ( identifier-list opt )

À§¿¡¼­ Á÷Á¢-¼±¾ðÀÚ (direct-declarator) ´Â ¸íĪÀ̰ųª °ýÈ£¿¡ ½×ÀÎ ¸íĪÀ̾î¾ß ÇÕ´Ï´Ù. Ưº°È÷, typedef ÀÇ ¹æ¹ýÀ¸·Î ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö´Â ¾ø½À´Ï´Ù.
  ù¹øÂ° ÇüÅ´Â, Çö´ëÀû ¹æ½Ä (new-style) ÀÇ ÇÔ¼öÁ¤ÀÇÀ̸ç, ¸Å°³º¯¼ö´Â µ¥ÀÌÅÍÇü°ú ÇÔ²² ¸Å°³º¯¼ö µ¥ÀÌÅÍÇü ¸®½ºÆ® (parameter type list) ¿¡¼­ ¼±¾ðµË´Ï´Ù; ÇÔ¼öÀÇ ¼±¾ðÀÚ (declarator) µÚ¿¡ ¿À´Â ¼±¾ð-¸®½ºÆ® (declaration-list) ´Â ¾ø¾î¾ß¸¸ ÇÕ´Ï´Ù. ¸¸¾à ¸Å°³º¯¼ö µ¥ÀÌÅÍÇü ¸®½ºÆ®¿¡ ¸Å°³º¯¼ö°¡ ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÏ´Â void °¡ È¥ÀÚ ¾²ÀÎ °æ¿ì°¡ ¾Æ´Ï¶ó¸é, ¸Å°³º¯¼ö µ¥ÀÌÅÍÇü ¸®½ºÆ®ÀÇ °¢ ¼±¾ðÀÚ´Â ¹Ýµå½Ã ¸íĪÀ» Æ÷ÇÔÇØ¾ß ÇÕ´Ï´Ù. ¸Å°³º¯¼ö µ¥ÀÌÅÍÇü ¸®½ºÆ®°¡ ", ..." ·Î ³¡³­´Ù¸é, ±× ÇÔ¼ö´Â ¸Å°³º¯¼ö (parameter) º¸´Ù ´õ ¸¹Àº °³¼öÀÇ ÀÎÀÚ (argument) ¸¦ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù; Ç¥ÁØ Çì´õÆÄÀÏ <stdarg.h> ¿¡¼­ Á¤ÀÇµÈ va_arg ¸ÅÅ©·Î ±â¹ýÀ» »ç¿ëÇØ¾ß¸¸ ±× °¡º¯ÀÎÀÚ¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù. °¡º¯ÀÎÀÚ ÇÔ¼ö (variadic function) ¿¡´Â Àû¾îµµ 1°³ÀÇ À̸§ÀÌ ºÙÀº ¸Å°³º¯¼ö°¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù.
  µÎ¹øÂ° ÇüÅ´Â, °íÀüÀû ¹æ½Ä (old-style) ÀÇ ÇÔ¼öÁ¤ÀÇ ÀÔ´Ï´Ù: ¸íĪ ¸®½ºÆ® (identifier list) ´Â ¸Å°³º¯¼öÀÇ À̸§µéÀ̸ç, ¼±¾ð ¸®½ºÆ® (declaration list) ¿¡¼­ ±× ¸Å°³º¯¼öÀÇ µ¥ÀÌÅÍÇüÀ» ¼±¾ðÇØ ÁÝ´Ï´Ù. ¸¸¾à ¾î¶² ¸Å°³º¯¼ö¿¡ µ¥ÀÌÅÍÇüÀÌ ÁÖ¾îÁöÁö ¾ÊÀ¸¸é, int ÇüÀ¸·Î Ãë±ÞµË´Ï´Ù. ¼±¾ð ¸®½ºÆ®´Â ¸íĪ ¸®½ºÆ®¿¡ ÀÖ´Â ¸Å°³º¯¼ö¸¸À» ¼±¾ðÇØ¾ß Çϸç, ÃʱâÈ­´Â Çã¶ôµÇÁö ¾Ê°í, »ç¿ëÇÒ ¼ö ÀÖ´Â ±â¾ïºÎ·ù ÁöÁ¤ÀÚ´Â register »ÓÀÔ´Ï´Ù.
  µÎ°¡Áö ÇüÅÂÀÇ ÇÔ¼öÁ¤ÀÇ¿¡¼­, ¸Å°³º¯¼öµéÀº ÇÔ¼öº»Ã¼ (body) ¸¦ ±¸¼ºÇÏ´Â º¹¹® (compound statement) ÀÌ ½ÃÀÛÇÏÀÚ¸¶ÀÚ ¼±¾ðµÈ´Ù°í ÀÌÇØµË´Ï´Ù. µû¶ó¼­ µ¿ÀÏÇÑ ¸íĪÀÌ ÇÔ¼öº»Ã¼¿¡¼­ Àç¼±¾ðµÉ ¼ö ¾ø½À´Ï´Ù. (´Ü, ´Ù¸¥ ¸íεé°ú µ¿ÀÏÇϰÔ, ¾ÈÂÊ ºí·°¿¡¼­´Â Àç¼±¾ðµÉ ¼ö ÀÖ½À´Ï´Ù) ¸¸¾à ¸Å°³º¯¼ö°¡ "¹è¿­Çü (array of type)" À̶ó¸é ¼±¾ðÀÌ "Æ÷ÀÎÅÍÇü (pointer to type)" À¸·Î Á¶Á¤µÇ¸ç, À¯»çÇÏ°Ô "ÇÔ¼öÇü (function returning type)" À̶ó¸é "ÇÔ¼ö Æ÷ÀÎÅÍÇü (pointer to function returning type)" À¸·Î Á¶Á¤µË´Ï´Ù. ÇÔ¼ö¸¦ È£ÃâÇÏ´Â µ¿¾È, ÀÎÀÚ (argument) ´Â Çʿ信 µû¶ó º¯È¯µÇ°í, ¸Å°³º¯¼ö·Î ´ëÀԵ˴ϴÙ. (A7.3.2 Âü°í)

  Çö´ëÀû ¹æ½ÄÀÇ ÇÔ¼öÁ¤ÀÇ´Â ANSI Ç¥Áؾȿ¡¼­ »õ·Î¿î °ÍÀÔ´Ï´Ù. ¿©±â¿¡´Â Áø±Þ (promotion) ¿¡ ´ëÇÑ ¶Ç ÇϳªÀÇ ÀÛÀº º¯È­°¡ ÀÖ½À´Ï´Ù: ÃÊÆÇ¿¡¼­´Â float ÇüÀÇ ¸Å°³º¯¼ö°¡ double ÇüÀ¸·Î Á¶Á¤µÇ¾ú½À´Ï´Ù. ÀÌ º¯È­´Â ÇÔ¼ö¾È¿¡¼­ ¸Å°³º¯¼ö¸¦ °¡¸£Å°´Â Æ÷ÀÎÅ͸¦ »ý¼ºÇÏ´Â °æ¿ì¿¡¾ß °Ü¿ì ´«¿¡ ¶é¸¸ÇÑ °ÍÀÔ´Ï´Ù.

  Çö´ëÀû ¹æ½ÄÀÇ ÇÔ¼öÁ¤ÀÇ¿¡ ´ëÇÑ ¿Ïº®ÇÑ ¿¹°¡ ¾Æ·¡¿¡ ÀÖ½À´Ï´Ù.

                int max(int a, int b, int c)
                {
                      int m;
                      m = (a > b) ? a : b;
                      return (m > c) ? m : c;
                }

¿©±â¼­ ù¹øÂ° int ´Â ¼±¾ð ÁöÁ¤ÀÚ (declaration specifier) ÀÔ´Ï´Ù; max(int a, int b, int c) ´Â ÇÔ¼öÀÇ ¼±¾ðÀÚÀ̸ç, { ... } ºÎºÐÀº ÇÔ¼öº»Ã¼¸¦ À§ÇÑ ºí·°ÀÔ´Ï´Ù. À§ÀÇ ¿¹¿¡ ´ëÀÀÇÏ´Â °íÀüÀû ¹æ½ÄÀÇ ÇÔ¼öÁ¤ÀÇ´Â ¾Æ·¡¿Í °°½À´Ï´Ù.

                int max(a, b, c)
                int a, b, c;
                {
                      /* ... */
                }

À§¿¡¼­ int max(a, b, c) ´Â ¼±¾ðÀÚ (declarator) À̸ç, int a, b, c; ´Â ¸Å°³º¯¼öÀÇ ¼±¾ð ¸®½ºÆ® (declaration list) ÀÔ´Ï´Ù.

¢¹ A10.2 ¿ÜºÎ¼±¾ð (External Declaration)
  ¿ÜºÎ¼±¾ðÀº ´ë»óü, ÇÔ¼ö, ȤÀº ´Ù¸¥ ¸íεéÀÇ Æ¯¼ºÀ» ¸í½ÃÇØ ÁÝ´Ï´Ù. ¿©±â¼­ »ç¿ëÇÏ´Â "¿ÜºÎ (external)" ¶ó´Â ¿ë¾î´Â ÇÔ¼öÀÇ ¹ÛÀ̶ó´Â À§Ä¡¸¦ ÀǹÌÇÏ´Â °ÍÀÏ»Ó, extern Ű¿öµå¿Í´Â Á÷Á¢ÀûÀ¸·Î °ü°è°¡ ¾ø½À´Ï´Ù; ¿ÜºÎ¿¡¼­ ¼±¾ðµÈ ´ë»óüÀÇ ±â¾ïºÎ·ù ÁöÁ¤ÀÚ´Â ¾ø¾îµµ (empty) ÁÁÀ¸¸ç, extern À̳ª static À» ÁöÁ¤ÇØÁ൵ µË´Ï´Ù.
  ¸¸¾à ±× ¸íĪ¿¡ ´ëÇÑ Á¤Àǰ¡ ÇѰ³¸¸ Á¸ÀçÇÑ´Ù¸é, µ¥ÀÌÅÍÇü°ú ¿¬°á (linkage) ÀÌ ÀÏÄ¡ÇÏ´ÂÇÑ, °°Àº ¸íĪ¿¡ ´ëÇÑ ¿©·¯°³ÀÇ ¿ÜºÎ¼±¾ðÀÌ µ¿ÀÏÇÑ ¹ø¿ª´ÜÀ§ (translation unit) ³»¿¡ Á¸ÀçÇÒ ¼ö ÀÖ½À´Ï´Ù.
  µÎ ¼±¾ðÀº A8.10 Àý¿¡¼­ ¼³¸íÇß´ø ±ÔÄ¢¿¡ ÀÇÇØ, µ¥ÀÌÅÍÇüÀÌ µ¿ÀÏÇѰ¡ ÆÇ´ÜµË´Ï´Ù. ¸¸¾à, ÇÑ ¼±¾ðÀÇ µ¥ÀÌÅÍÇüÀº ºÒ¿ÏÀüÇÑ (incomplete) ±¸Á¶Ã¼ ¡¤ °ø¿ëü ȤÀº ¿­°ÅÇü (A8.3) À̰í, ´Ù¸¥ ¼±¾ðÀÇ µ¥ÀÌÅÍÇüÀº µ¿ÀÏÇÑ ÅÃÀ» °®°í ÀÖ´Â ´ëÀÀÇÏ´Â ¿ÏÀüÇÑ Çü (complete type) À̶ó¸é, µÎ µ¥ÀÌÅÍÇüÀº ÀÏÄ¡ÇÑ´Ù°í Ãë±ÞµË´Ï´Ù. ¶Ç, ÇÑ µ¥ÀÌÅÍÇüÀº ºÒ¿ÏÀüÇÑ ¹è¿­Çü (A8.6.2) À̰í, ´Ù¸¥ ¼±¾ðÀº ¿ÏÀüÇÑ ¹è¿­ÇüÀ̸ç, ±×¿Ü ´Ù¸¥ ºÎºÐÀÌ µ¿ÀÏÇÏ´Ù¸é, ±× µÎ µ¥ÀÌÅÍÇüµµ ÀÏÄ¡ÇÑ´Ù°í Ãë±ÞµË´Ï´Ù. ¸¶Áö¸·À¸·Î ÇÑ µ¥ÀÌÅÍÇüÀº °íÀüÀû ¹æ½Ä (old-style) ÀÇ ÇÔ¼öÀ̰í, ´Ù¸¥ µ¥ÀÌÅÍÇüÀº ´Ù¸¥Á¡¿¡¼­ µ¿ÀÏÇÏ°í ¸Å°³º¯¼ö ¼±¾ð (parameter declaration) ÀÌ ÀÖ´Â Çö´ëÀû ¹æ½Ä (new-style) ÀÇ ÇÔ¼ö¶ó¸é, ±× µÎ µ¥ÀÌÅÍÇüµµ ÀÏÄ¡ÇÑ´Ù°í Ãë±ÞµË´Ï´Ù.
  ¸¸¾à ÇÔ¼ö³ª ´ë»óüÀÇ Ã¹¹øÂ° ¿ÜºÎ¼±¾ðÀÌ static ÁöÁ¤ÀÚ¸¦ Æ÷ÇÔÇÑ´Ù¸é, ±× ¸íĪÀº ³»ºÎ¿¬°á (internal linkage) À» °®½À´Ï´Ù; ±×·¸Áö ¾ÊÀ¸¸é ¿ÜºÎ¿¬°á (external linkage) À» °®½À´Ï´Ù. ¿¬°á (linkage) ¿¡ ´ëÇØ¼­´Â A11.2 Àý¿¡¼­ ¼³¸íÇÕ´Ï´Ù.
  ´ë»óüÀÇ ¿ÜºÎ¼±¾ðÀÌ ÃʱâÄ¡¸¦ °¡Áö°í ÀÖ´Ù¸é ±×°ÍÀº Á¤ÀÇ (definition) °¡ µË´Ï´Ù. ´ë»óüÀÇ ¿ÜºÎ¼±¾ðÀÌ ÃʱâÄ¡¸¦ °¡Áö°í ÀÖÁö ¾ÊÀ¸¸ç, extern ÁöÁ¤ÀÚ¸¦ Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù¸é, ±× ¼±¾ðÀº ÀÓ½ÃÁ¤ÀÇ (tentative definition) °¡ µË´Ï´Ù. ¸¸¾à ´ë»óüÀÇ Á¤Àǰ¡ ¹ø¿ª´ÜÀ§ (translation unit) ³»¿¡ ³ªÅ¸³­´Ù¸é, ¸ðµç ÀÓ½ÃÁ¤ÀÇ´Â ´Ù¸¸ Áߺ¹µÈ ¼±¾ðÀ¸·Î ´Ù·ç¾îÁý´Ï´Ù. ´ë»óüÀÇ Á¤Àǰ¡ ¹ø¿ª´ÜÀ§³»¿¡ ³ªÅ¸³ªÁö ¾ÊÀ¸¸é, ±× ´ë»óüÀÇ ¸ðµç ÀÓ½ÃÁ¤ÀÇ´Â ÃʱâÄ¡ 0 À» °®´Â ÇϳªÀÇ Á¤Àǰ¡ µË´Ï´Ù.
  °¢ ´ë»óü´Â Çѹø¸¸ Á¤ÀÇµÉ ¼ö ÀÖ½À´Ï´Ù. ³»ºÎ¿¬°á (internal linkage) À» °®´Â ´ë»óü´Â °¢ ¹ø¿ª´ÜÀ§¿¡¼­ À¯ÀÏÇϱ⠶§¹®¿¡, ÀÌ·¯ÇÑ ±ÔÄ¢ÀÌ °¢ ¹ø¿ª´ÜÀ§¸¶´Ù ºÐ¸®µÇ¾î Àû¿ëµË´Ï´Ù. ¿ÜºÎ¿¬°á (external linkage) À» °®´Â ´ë»óü´Â ÀÌ ±ÔÄ¢ÀÌ ÇÁ·Î±×·¥ Àüü¿¡ Àû¿ëµË´Ï´Ù.

  ÀÌ Ã¥ÀÇ ÃÊÆÇ¿¡¼­´Â Á¤ÀÇ´Â Çѹø¸¸ ÀÖ¾î¾ß ÇÑ´Ù´Â ±ÔÄ¢ÀÌ ´Ù¼Ò ´Ù¸£°Ô ¼³¸íµÇ¾úÁö¸¸, ½ÇÁ¦·Î´Â ¿©±â¿¡¼­ ¼­¼úÇÑ °Í°ú µ¿ÀÏÇÑ ³»¿ëÀÔ´Ï´Ù. ÀϺΠÄÄÆÄÀÏ·¯¿¡¼­´Â ÀÓ½ÃÁ¤ÀÇ (tentative definition) ÀÇ °³³äÀ» ÀϹÝÈ­ÇØ¼­ ±× ±ÔÄ¢À» ´Ù¼Ò ¿ÏÈ­ÇÏ¿´½À´Ï´Ù. UNIX ½Ã½ºÅÛ¿¡¼­´Â ÀÌ¹Ì ÀϹÝÀûÀ̸ç, Ç¥ÁØ¿¡ ÀÇÇØ ÀϹÝÀûÀÎ È®Àå (common extension by the Standard) À¸·Î ÀÎÁ¤µÈ, ´ëüµÈ ±ÔÄ¢¿¡¼­´Â, ¿ÜºÎ¿¬°á (external linkage) À» °®´Â ´ë»óüÀÇ ¸ðµç ÀÓ½ÃÁ¤ÀÇ´Â, ºÐ¸®µÈ °¢ ¹ø¿ª´ÜÀ§°¡ ¾Æ´Ñ, ÇÁ·Î±×·¥ÀÇ ¸ðµç ¹ø¿ª´ÜÀ§ Àüü¸¦ Åëµé¾î¼­ ÆÇ´ÜµË´Ï´Ù. ¸¸¾à ÇÁ·Î±×·¥ ¾îµò°¡¿¡ Á¤Àǰ¡ ³ªÅ¸³­´Ù¸é, ÀÓ½ÃÁ¤ÀÇ´Â ¼±¾ðÀ¸·Î ¹Ù²î¸ç, Á¤Àǰ¡ ³ªÅ¸³ªÁö ¾Ê´Â´Ù¸é, ¸ðµç ÀÓ½ÃÁ¤Àǰ¡ ÃʱâÄ¡ 0 À» °®´Â ÇϳªÀÇ ½ÇÁ¦ Á¤Àǰ¡ µË´Ï´Ù.


ÀÌÀü [¡ã ¸ÇÀ§·Î]
[¢Ê ¸ñÂ÷·Î]
´ÙÀ½