¸ðµç Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Éº¼ Å×À̺í°ú ±×¿Í °ü·ÃµÈ ½Éº¼µéÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿ÀÇ °üÁ¡¿¡¼ º¼ ¶§ ½Éº¼µéÀ» ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÒ ¼ö ÀÖ´Ù.
ÇöÀçÀÇ ÆÄÀÏ¿¡¼ Á¤Àǵǰí, ´Ù¸¥ ÆÄÀϵ鿡¼ ÂüÁ¶µÇ´Â Àü¿ª ½Éº¼. ¸ðµç non-static ÇÔ¼öµé°ú Àü¿ª º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù.
ÇöÀçÀÇ ÆÄÀÏ¿¡¼ ÂüÁ¶´Â µÇ³ª, ´Ù¸¥ °÷¿¡¼ Á¤ÀÇµÈ Àü¿ª ½Éº¼. externÀ¸·Î Á¤ÀÇµÈ ¸ðµç ÇÔ¼öµé°ú º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù.
ÇöÀçÀÇ ÆÄÀÏ¿¡¼¸¸ Á¤Àǵǰí ÂüÁ¶µÇ´Â Áö¿ª ½Éº¼. ¸ðµç static ÇÔ¼öµé°ú º¯¼öµéÀÌ ÀÌ ºÐ·ù¿¡ ÇØ´çÇÑ´Ù.
¸µÄ¿´Â ½Éº¼ÀÇ ÂüÁ¶¸¦ ÇØ¼®ÇÒ ¶§, ÀÔ·ÂÀ¸·Î ÁÖ¾îÁö´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ½Éº¼ Å×À̺í·ÎºÎÅÍ ²À Çϳª¸¸ Á¸ÀçÇÏ´Â ½Éº¼ÀÇ Á¤ÀǸ¦ ÂüÁ¶ÇÏ¿© ½Éº¼ ÂüÁ¶¸¦ ÇØ¼®ÇÑ´Ù. Áö¿ª ½Éº¼(local symbol)Àº ±×¿¡ ´ëÇÑ ´ÙÁß Á¤ÀÇ(multiple definitions)¸¦ ½Éº¼ Å×À̺íÀÌ °¡Áú ¼ö ¾øÀ¸¹Ç·Î ½±°Ô ÇØ¼®µÈ´Ù. ±×·¯³ª Àü¿ª ½Éº¼ÀÇ ÇØ¼®Àº ¾à°£ÀÇ Æ®¸¯ÀÌ ¿ä±¸µÈ´Ù. ÄÄÆÄÀÏ Å¸ÀÓ¶§, ÄÄÆÄÀÏ·¯´Â Àü¿ª ½Éº¼µéÀ» strong ȤÀº weakÇÑ °ÍÀ¸·Î ¸¸µå´Âµ¥, ÇÔ¼öµé°ú ÃʱâÈµÈ Àü¿ª º¯¼öµéÀº strongÇϰÔ, ÃʱâȵÇÁö ¾ÊÀº º¯¼öµéÀº weakÇÏ°Ô ¸¸µç´Ù. ±×·¯¸é ¸µÄ¿´Â ¾Æ·¡ÀÇ ·êÀ» Àû¿ëÇÏ¿© ½Éº¼µéÀ» ÇØ¼®ÇÏ°Ô µÈ´Ù.
´ÙÁß strong ½Éº¼µéÀº Çã°¡µÇÁö ¾Ê´Â´Ù.
ÇϳªÀÇ strong ½Éº¼°ú ¿©·¯°³ÀÇ weak ½Éº¼µéÀÌ ÀÖÀ¸¸é, strong ½Éº¼À» ¼±ÅÃÇÑ´Ù.
¿©·¯°³ÀÇ weak ½Éº¼µéÀÌ ÀÖÀ¸¸é, ±×°ÍµéÁß ¾Æ¹«°Å³ª ¼±ÅÃÇÑ´Ù.
¿¹·Î, ´ÙÀ½°ú °°Àº µÎ ÇÁ·Î±×·¥ÀÇ ¸µÅ·Àº ¸µÅ©-ŸÀÓ ¿¡·¯¸¦ ³½´Ù.
/* foo.c */ int foo() { return 0; } |
/* bar.c */ int foo() { return 1; } int main() { foo(); } |
foo (Àü¿ª ÇÔ¼ö·Î½á strong ½Éº¼ÀÌ´Ù)°¡ µÎ ¹ø Á¤ÀÇ µÇ¾úÀ¸¹Ç·Î, ¸µÄ¿´Â ¾Æ·¡¿Í °°Àº ¿¡·¯ ¸Þ¼¼Áö¸¦ ³½´Ù.
gcc foo.c bar.c
/tmp/ccM1DKre.o: In function 'foo':
/tmp/ccM1DKre.o(.text+0x0): multiple definition of 'foo'
/tmp/ccIhvEMn.o(.text+0x0): first defined here
collect2: ld returned 1 exit status
collec2´Â GCC¿¡ ÀÇÇØ È£ÃâµÇ´Â ¸µÄ¿ ldÀÇ wrapperÀÌ´Ù.