C ÇÁ·Î±×·¡¹Ö ÆÁ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>C>Documents>Tip



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¸ñÂ÷

1 C¿¡¼­ mainº¸´Ù ¸ÕÀú È£ÃâµÇ´Â ÇÔ¼ö ¸¸µé±â
2 C ¾ð¾î¿Í C++ ¾ð¾î¿¡¼­ const ó¸®


1 C¿¡¼­ mainº¸´Ù ¸ÕÀú È£ÃâµÇ´Â ÇÔ¼ö ¸¸µé±â

Ãâó : [http]kldp

¾Æ·¡ ±ÛÀº http://writely.com/ ¿¡¼­ ÀÛ¼ºÇÏ¿© http://kldp.org/xmlrpc.php ¸¦ ÅëÇÏ¿© Æ÷½ºÆÃÇÑ ±ÛÀÔ´Ï´Ù. Full HTML·Î ¼Ó¼ºÀ» ¼öÁ¤Çß½À´Ï´Ù. Å×½ºÆ® °â Áߺ¹ Æ÷½ºÆÃÀ̳׿ä..
¿ø¹®Àº http://pynoos.byus.net/tt/index.php?pl=135 ÀÔ´Ï´Ù.
C++ ¾ð¾î´Â ±× Ư¼º»ó, Àü¿ª °³Ã¼ÀÇ ÃʱâÈ­°¡ main º¸´Ù ¸ÕÀú ÀÌ·ç¾îÁö¹Ç·Î Àü¿ª °³Ã¼ÀÇ »ý¼ºÀÚ¿¡ µé¾î ÀÖ´Â ÄÚµå´Â main º¸´Ù ¸ÕÀú È£ÃâµÈ´Ù.
À̰ÍÀº ¿©·¯°¡Áö Æ®¸¯À¸·Î »ç¿ëµÉ ¼ö Àִµ¥, C¿¡´Â °ú¿¬ ±×·± °ÍÀÌ ¾øÀ»±î? Ç¥ÁØ ¸í¼¼¿¡´Â ¾ø´Ù.
ÇÏÁö¸¸, 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ÀÇ À§Ä¡¿¡ µû¶ó¼­ ´Ù¾çÇÑ Á¾·ù°¡ ³ª¿Ã ¼ö ÀÖ½À´Ï´Ù.
  1. const int *cip (¶Ç´Â int const *ip)
  2. int * const icp
  3. const int * const cicp (¶Ç´Â int const * const ip)

ù¹øÂ°´Â const int¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ ipÀÔ´Ï´Ù. Áï const qualified int (°ªÀ» ¹Ù²Ü ¼ö ¾ø´Â Á¤¼ö ŸÀÔ)À» °¡¸®Å°´Â Æ÷ÀÎÅÍÀÔ´Ï´Ù. ÀÌ Æ÷ÀÎÅÍ´Â ¾ó¸¶µçÁö ´Ù¸¥ const int¸¦ °¡¸®Å°µµ·Ï ¹Ù²Ü ¼ö ÀÖÁö¸¸, °¡¸®Å°°í ÀÖ´Â ´ë»óÀÇ °ªÀ» ¹Ù²Ü ¼ö´Â ¾ø½À´Ï´Ù.
 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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.