| |
¢¹ 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 À» °®´Â ÇϳªÀÇ ½ÇÁ¦ Á¤Àǰ¡ µË´Ï´Ù. |
|