5. ½Éº¼µé°ú ½Éº¼ ÇØ¼®

¸ðµç Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀϵéÀº ½Éº¼ Å×À̺í°ú ±×¿Í °ü·ÃµÈ ½Éº¼µéÀ» °¡Áö°í ÀÖ´Ù. ¸µÄ¿ÀÇ °üÁ¡¿¡¼­ º¼ ¶§ ½Éº¼µéÀ» ´ÙÀ½°ú °°ÀÌ ºÐ·ùÇÒ ¼ö ÀÖ´Ù.

¸µÄ¿´Â ½Éº¼ÀÇ ÂüÁ¶¸¦ ÇØ¼®ÇÒ ¶§, ÀÔ·ÂÀ¸·Î ÁÖ¾îÁö´Â Àç¹èÄ¡ °¡´ÉÇÑ ¿ÀºêÁ§Æ® ÆÄÀÏÀÇ ½Éº¼ Å×À̺í·ÎºÎÅÍ ²À Çϳª¸¸ Á¸ÀçÇÏ´Â ½Éº¼ÀÇ Á¤ÀǸ¦ ÂüÁ¶ÇÏ¿© ½Éº¼ ÂüÁ¶¸¦ ÇØ¼®ÇÑ´Ù. Áö¿ª ½Éº¼(local symbol)Àº ±×¿¡ ´ëÇÑ ´ÙÁß Á¤ÀÇ(multiple definitions)¸¦ ½Éº¼ Å×À̺íÀÌ °¡Áú ¼ö ¾øÀ¸¹Ç·Î ½±°Ô ÇØ¼®µÈ´Ù. ±×·¯³ª Àü¿ª ½Éº¼ÀÇ ÇØ¼®Àº ¾à°£ÀÇ Æ®¸¯ÀÌ ¿ä±¸µÈ´Ù. ÄÄÆÄÀÏ Å¸ÀÓ¶§, ÄÄÆÄÀÏ·¯´Â Àü¿ª ½Éº¼µéÀ» strong ȤÀº weakÇÑ °ÍÀ¸·Î ¸¸µå´Âµ¥, ÇÔ¼öµé°ú ÃʱâÈ­µÈ Àü¿ª º¯¼öµéÀº strongÇϰÔ, ÃʱâÈ­µÇÁö ¾ÊÀº º¯¼öµéÀº weakÇÏ°Ô ¸¸µç´Ù. ±×·¯¸é ¸µÄ¿´Â ¾Æ·¡ÀÇ ·êÀ» Àû¿ëÇÏ¿© ½Éº¼µéÀ» ÇØ¼®ÇÏ°Ô µÈ´Ù.

  1. ´ÙÁß strong ½Éº¼µéÀº Çã°¡µÇÁö ¾Ê´Â´Ù.

  2. ÇϳªÀÇ strong ½Éº¼°ú ¿©·¯°³ÀÇ weak ½Éº¼µéÀÌ ÀÖÀ¸¸é, strong ½Éº¼À» ¼±ÅÃÇÑ´Ù.

  3. ¿©·¯°³ÀÇ 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ÀÌ´Ù.