ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 C¿¡¼ mainº¸´Ù ¸ÕÀú È£ÃâµÇ´Â ÇÔ¼ö ¸¸µé±â
Ãâó : kldp
¾Æ·¡ ±ÛÀº http://writely.com/ ¿¡¼ ÀÛ¼ºÇÏ¿© http://kldp.org/xmlrpc.php ¸¦ ÅëÇÏ¿© Æ÷½ºÆÃÇÑ ±ÛÀÔ´Ï´Ù. Full HTML·Î ¼Ó¼ºÀ» ¼öÁ¤Çß½À´Ï´Ù. Å×½ºÆ® °â Áߺ¹ Æ÷½ºÆÃÀ̳׿ä..
¿ø¹®Àº http://pynoos.byus.net/tt/index.php?pl=135 ÀÔ´Ï´Ù.
À̰ÍÀº ¿©·¯°¡Áö Æ®¸¯À¸·Î »ç¿ëµÉ ¼ö Àִµ¥, C¿¡´Â °ú¿¬ ±×·± °ÍÀÌ ¾øÀ»±î? Ç¥ÁØ ¸í¼¼¿¡´Â ¾ø´Ù.C++ ¾ð¾î´Â ±× Ư¼º»ó, Àü¿ª °³Ã¼ÀÇ ÃʱâȰ¡ main º¸´Ù ¸ÕÀú ÀÌ·ç¾îÁö¹Ç·Î Àü¿ª °³Ã¼ÀÇ »ý¼ºÀÚ¿¡ µé¾î ÀÖ´Â ÄÚµå´Â main º¸´Ù ¸ÕÀú È£ÃâµÈ´Ù. ÇÏÁö¸¸, gccÀÇ attribute¿¡´Â ±×·¯ÇÑ ÀÏÀ» °¡´ÉÇÏ°Ô ÇØÁÖ´Â Áö½ÃÀÚ°¡ Àִµ¥, ¹Ù·Î ´ÙÀ½°ú °°ÀÌ »ç¿ëµÈ´Ù. void __attribute__((constructor)) before_main( void ) { /* Things to do before main function */ }
¶ÇÇÑ main µÚ¿¡ È£ÃâµÇ´Â ÀüÇüÀûÀÎ ¹æ½ÄÀº atexit¿¡ µî·ÏÇÏ´Â °ÍÀε¥, À̰ͶÇÇÑ void __attribute__((destructor)) after_main( void ) { /* Things to do after main function */ }¿Í °°Àº ¹æ½ÄÀ¸·Î È£ÃâµÈ´Ù.
°£´ÜÇÑ »ùÇÃÀ» µ¹·Áº¸ÀÚ¸é, $ more c.c #ifdef STRIP_ATTR #define __attribute__(x) #endif void __attribute__((constructor)) before_main( void ) { printf("I miss you Lorthlorien ever beauty.\n"); } void __attribute__((constructor)) before_main_2nd( void ) { printf("Bombadil, where have you been in the morning?\n"); } void __attribute__((destructor)) after_main( void ) { printf("Mithlandir, help me!\n"); } int main() { printf("I am working, no touch!\n"); return 0; } $ gcc -o c1 -save-temps c.c $ ./c1 Bombadil, where have you been in the morning? I miss you Lorthlorien ever beauty. I am working, no touch! Mithlandir, help me!
±Ù»çÇÏÁö ¾ÊÀº°¡? ´Ù¸¸ Àǽɰ¡´Â °ÍÀº __attribute((constructor))·Î ÁöÁ¤ÇÑ ÇÔ¼öµéÀÌ µÎ °³ ÀÌ»óÀ϶§ÀÇ ¼ø¼´Â ¾î¶°ÇϳĴ °ÍÀε¥, ¿Ü°ü»ó stackÇü½ÄÀ¸·Î ¸ÕÀú ¹ß°ßµÇ´Â °ÍÀÌ ³ªÁß¿¡ ½ÇÇàµÇ´Â °Í °°´Ù. ÀÚ¼¼ÇÑ °ÍÀº ÃßÈÄ¿¡ ¼³¸íÇÏÁöµµ ¸ð¸£°Ú´Ù.
À̰ÍÀÌ ¼öÇàµÇ´Â ¿ø¸®¸¦ Á»´õ ÆÄÇìÃĺ¸ÀÚ¸é,
¿ì¼± À§ ÄÚµå»ó¿¡ STRIP_ATTRÀ̶ó°í µÇ¾î ÀÖ´Â ºÎºÐÀÌ ¼öÇàµÇµµ·ÏÇÏ¸é Æò¹üÇÑ ÇÔ¼ö°¡ µÇ´Âµ¥, ±×·¸°Ô »ý¼ºµÈ ¹ÙÀ̳ʸ®(c2)ÀÇ ½Éº¼µéÀ» »ìÆìº¸ÀÚ. nm Àº -n ¿É¼ÇÀ» ÁÖ¾î ¹øÁö·Î Á¤·ÄµÇµµ·Ï ÇÏ¿´´Ù. µÎ nm °á°ú¸¦ ºñ±³Çϴµ¥´Â unified diff¸¦ »ç¿ëÇÏ¿© º¸ÀÚ. ±×¸®°í -save-temps ¸¦ ÅëÇØ »ý¼ºµÇ´Â c.s ¶ó´Â ¾î¼Àºí¸®¾î ÆÄÀÏÀº °¢°¢ c1.s c2.s·Î À̸§À» ¹Ù²Ù´Â °úÁ¤ÀÌ µé¾î°¡ ÀÖ´Ù. $ mv c.s c1.s $ gcc -o c1 c.c $ gcc -o c2 -DSTRIP_ATTR -save-temps c.c $ mv c.s c2.s $ nm -n c1 > c1.nm $ nm -n c2 > c2.nm $ diff -u c1.nm c2.nm --- c1.nm Thu Jan 5 13:29:16 2006 +++ c2.nm Thu Jan 5 13:29:20 2006 @@ -27,14 +27,14 @@ 0804952c r __FRAME_END__ 08049530 D _DYNAMIC 080495f8 d __CTOR_LIST__ -08049604 d __CTOR_END__ -08049608 d __DTOR_LIST__ -08049610 d __DTOR_END__ -08049614 d __JCR_END__ -08049614 d __JCR_LIST__ -08049618 D _GLOBAL_OFFSET_TABLE_ -08049630 A __bss_start -08049630 A _edata -08049630 b completed.1 -08049634 b object.2 -0804964c A _end +080495fc d __CTOR_END__ +08049600 d __DTOR_LIST__ +08049604 d __DTOR_END__ +08049608 d __JCR_END__ +08049608 d __JCR_LIST__ +0804960c D _GLOBAL_OFFSET_TABLE_ +08049624 A __bss_start +08049624 A _edata +08049624 b completed.1 +08049628 b object.2 +08049640 A _end
À̰ÍÀ» Àß º¸¾ÆÇÏ´Ï CTOR_LIST ¶ó´Â °ª±îÁö´Â °°°í ±× µÚ°¡ ´Þ¶óÁö´Â °ÍÀ» º¼ ¼ö°¡ ÀÖ´Ù.
¾Æ¾Ñ! À̰ÍÀº! ´ÜÁö section .ctor, .dtor¿¡ ÇÔ¼ö Æ÷ÀÎÅ͸¸ Ãß°¡ÇÏ´Â ÀÏÀ» ÇÏ´Â °Í ¾Æ´Ñ°¡. ±×·¸´Ù¸é, .ctor¸¦ ã¾Æ¼ Çϳª¾¿ È£ÃâÇÏ´Â ºÎºÐÀº ¾îµð¿¡ ÀÖ´Ù´Â °ÍÀÌÁö? ((°è¼Ó)) 2 C ¾ð¾î¿Í C++ ¾ð¾î¿¡¼ const ó¸®
C ¾ð¾î¿Í C++ ¾ð¾î¿¡¼ 'const' 󸮴 Á¶±Ý ´Ù¸¨´Ï´Ù. Shocked?
ÀÏ´Ü C ¾ð¾îÀÇ °æ¿ì, 32, 012, 0x3 µîÀº Á¤¼ö »ó¼öÀÔ´Ï´Ù (integer constant). ¶Ç´Â Á¤¼ö »ó¼ö½Ä (integer constant expression)À̶ó°íµµ ÇÕ´Ï´Ù. °¡º¯ ¹è¿À» Á¦¿ÜÇϰí, ¹è¿ Å©±â¸¦ ½á Áشٰųª, struct bit-field·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Â ¼öÄ¡´Â ¸ðµÎ Á¤¼ö »ó¼ö½ÄÀ̾î¾ß ÇÕ´Ï´Ù.
const int ci = 3 ¿¡¼, º¯¼ö ciÀÇ Å¸ÀÔÀº const intÀÔ´Ï´Ù. º¸Åë ÀÌ·± ½ÄÀ¸·Î 'const'°¡ ºÙÀº ŸÀÔÀ» const-qualified typeÀ̶ó°í ÇÕ´Ï´Ù. ±×¸®°í const-qualified typeÀÇ ¿ÀºêÁ§Æ®´Â Á¤¼ö »ó¼ö°¡ ¾Æ´Õ´Ï´Ù. µû¶ó¼ (°¡º¯ ¹è¿À» Á¦¿ÜÇϰí) ¹è¿ÀÇ Å©±â¸¦ ÁöÁ¤ÇÒ ¶§ ci¸¦ ¾´´Ù°Å³ª, case ·¹À̺í·Î ¾µ ¼ö ¾ø½À´Ï´Ù.
C++ ¾ð¾î °æ¿ì, Á¤¼ö »ó¼ö, Á¤¼ö »ó¼ö½Ä µîÀº C ¾ð¾î¿Í °°½À´Ï´Ù. ´Ü. const-qualified typeÀÇ ¿ÀºêÁ§Æ®´Â Á¤¼ö »ó¼ö°¡ µË´Ï´Ù. µû¶ó¼ const int µîÀ¸·Î ¼±¾ðÇÑ °Íµµ Á¤¼ö »ó¼ö Ãë±ÞÀ» ¹Þ¾Æ¼ ¹è¿ÀÇ Å©±â¸¦ ÁöÁ¤ÇѴٰųª case ·¹À̺í·Î ¾µ ¼ö ÀÖ½À´Ï´Ù. const°¡ ºÙÀº ¿ÀºêÁ§Æ®... ¸»ÀÌ Á» ÀÌ»óÇÏÁÒ? ¾Æ¹«¸® »ý°¢ÇØ ºÁµµ Á» ´õ ³ªÀº Ç¥ÇöÀº "óÀ½ °ªÀ» ÁöÁ¤ÇÒ ¶§¸¦ Á¦¿ÜÇÏ°í °ªÀ» º¯°æÇÒ ¼ö ¾ø´Â ¿ÀºêÁ§Æ®"°¡ ´õ ³ªÀº Ç¥ÇöÀÏ °Í °°±ä Çѵ¥.. ±×·¸´Ù°í »ó¼ö¶ó°í Ç¥ÇöÇϱ⠰ï¶õÇÑ °Ô, À̰Ͱú Á¤¼ö »ó¼ö¿Í´Â ÀüÇô ´Ù¸¥ ¶æÀ̱⠶§¹®¿¡... Sad
¶Ç, C/C++ ¸ðµÎ, const-qualified typeÀ¸·Î ¼±¾ðÇÑ º¯¼ö´Â Á÷/°£Á¢ÀûÀ¸·Î ±× °ªÀ» º¯°æÇÏ¸é ¾ÈµË´Ï´Ù. ÀÌ´Â undefined behavior¿¡ ¼ÓÇÕ´Ï´Ù. ´ÙÀ½°ú °°Àº Äڵ带 º¸¸é ¹«½¼ ¸»ÀÎÁö ½±°Ô ¾Ë ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù: const int i = 3; int *p = (int *)&i; *p = 4; /* wrong: undefined behavior */¿©´ãÀ¸·Î C++¿¡¼ À§¿Í °°ÀÌ C ½ºÅ¸ÀÏ Å¸ÀÔ º¯È¯º¸´Ù, const_cast¸¦ ¾²´Â °ÍÀÌ ´õ ¹Ù¶÷Á÷ÇÕ´Ï´Ù. Æ÷ÀÎÅÍ ¼±¾ðÇÒ ¶§, constÀÇ À§Ä¡¿¡ µû¶ó¼ ´Ù¾çÇÑ Á¾·ù°¡ ³ª¿Ã ¼ö ÀÖ½À´Ï´Ù.
const int ci1 = 4, ci2 = 8; const int *cip = &ci1; cip = &ci2; /* ok */ *cip = 0; /* wrong */µÎ¹øÂ°´Â ÀÏ¹Ý Á¤¼ö ŸÀÔ int¸¦ °¡¸®Å°´Â const Æ÷ÀÎÅÍÀÔ´Ï´Ù. Áï, °¡¸®Å°´Â ´ë»óÀÌ intÀ̱⠶§¹®¿¡, ¾ó¸¶µçÁö °ªÀ» º¯°æÇÒ ¼ö ÀÖÁö¸¸, Æ÷ÀÎÅÍ ÀÚü°¡ constÀ̱⠶§¹®¿¡ ´Ù¸¥ int¸¦ °¡¸®Å°µµ·Ï ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù. int i1 = 4, i2 = 8; int * const icp = &i1; icp = &i2; /* wrong */ *icp = 0; /* ok */¼¼¹øÂ°´Â const int¸¦ °¡¸®Å°´Â const Æ÷ÀÎÅÍÀÔ´Ï´Ù. µû¶ó¼ ´Ù¸¥ ´ë»óÀ» °¡¸®Å°µµ·Ï Æ÷ÀÎÅ͸¦ ¹Ù²Ü ¼öµµ ¾ø°í, ´ë»óÀÌ °¡Áö°í ÀÖ´Â °ªÀ» ¹Ù²Ü ¼öµµ ¾ø½À´Ï´Ù. const int ci1 = 3, ci2 = 4; const int * const cicp = &ci1; cicp = &ci2; /* wrong */ *cicp = 0; /* wrong */Âü°í: ISO C Ç¥ÁØ Sec. 6.7.3.5 Âü°í: ISO C++ Ç¥ÁØ Sec. 5.2.11.7, Sec. 7.1.5.1 |
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|