| |
¢¹ A8.1 ±â¾ïºÎ·ù ÁöÁ¤ÀÚ (Storage Class Specifier)
±â¾ïºÎ·ù ÁöÁ¤ÀÚ´Â ´ÙÀ½°ú °°½À´Ï´Ù:
storage-class-specifier:
auto
register
static
extern
typedef
|
±â¾ïºÎ·ù ÁöÁ¤ÀÚÀÇ Àǹ̴ A4 Àý¿¡¼ ¾Ë¾Æº¸¾Ò½À´Ï´Ù.
auto ¿Í register ´Â ¼±¾ðµÈ ´ë»óü¸¦ ÀÚµ¿ ±â¾ïºÎ·ù (automatic storage
class) ·Î ¸¸µé¾î ÁÖ¸ç, ÇÔ¼ö ¾È¿¡¼¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¼±¾ðÀº
'Á¤ÀÇ'ó·³ ±â¾ïÀå¼Ò¸¦ ÇÒ´çÇØ ÁÝ´Ï´Ù. register ¼±¾ðÀº auto ¼±¾ð°ú µ¿ÀÏÇÏÁö¸¸,
ÄÄÆÄÀÏ·¯¿¡°Ô ¼±¾ðµÈ ´ë»óü°¡ ºó¹øÈ÷ »ç¿ëµÊÀ» ¾Ë·ÁÁÝ´Ï´Ù. ½ÇÁ¦·Î CPU
·¹Áö½ºÅÍ¿¡ ÀúÀåµÉ ¼ö ÀÖ´Â ´ë»óüÀÇ °³¼ö¿Í µ¥ÀÌÅÍÇü¿¡´Â Á¦ÇÑÀÌ ÀÖÀ¸¸ç,
ÀÚ¼¼ÇÑ Á¦ÇÑ»çÇ×Àº ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¨´Ï´Ù (implementation-dependent). ÇÏÁö¸¸ ÀÏ´Ü ´ë»óü°¡ register
·Î ¼±¾ðµÈ´Ù¸é, ¸í½ÃÀûÀÌµç ¾Æ´Ïµç ´ÜÇ× & ¿¬»êÀÚ°¡ Àû¿ëµÉ ¼ö ¾ø½À´Ï´Ù.
| |
½ÇÁ¦·Î´Â ´ë»óü°¡ ÀϹÝÀûÀÎ auto ·Î Ãë±ÞµÈ´Ù°í
ÇØµµ, register ·Î ¼±¾ðµÇ¾ú´Ù¸é ±× ´ë»óüÀÇ ÁÖ¼Ò¸¦ ¾òÀ» ¼ö ¾ø´Ù´Â °ÍÀº »õ·Î¿î
±ÔÄ¢ÀÔ´Ï´Ù. |
static ÁöÁ¤ÀÚ´Â ¼±¾ðµÈ ´ë»óü¸¦ Á¤Àû ±â¾ïºÎ·ù (static storage class) ·Î
¸¸µé¾î ÁÖ¸ç, ÇÔ¼ö ¾ÈÆÆ¿¡¼ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼ö ¾È¿¡¼, ÀÌ ÁöÁ¤ÀÚ´Â
'Á¤ÀÇ'ó·³ ±â¾ïÀå¼Ò¸¦ ÇÒ´çÇØ ÁÝ´Ï´Ù; ÇÔ¼ö ¹Û¿¡¼ÀÇ ¿µÇâÀº A11.2 ¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.
ÇÔ¼ö ¾È¿¡¼ »ç¿ëµÇ´Â extern ¼±¾ðÀº, ¼±¾ðµÈ ´ë»óü¸¦ À§ÇÑ ±â¾ïÀå¼Ò°¡
´Ù¸¥ °÷¿¡¼ Á¤ÀǵǾúÀ½À» ¾Ë·ÁÁÝ´Ï´Ù. ÇÔ¼ö ¹Û¿¡¼ÀÇ ¿µÇâÀº A11.2 ¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.
»ç¿ëÀÚ Á¤ÀÇ typedef ÁöÁ¤ÀÚ´Â ±â¾ïÀå¼Ò¸¦ ¿¹¾àÇÏÁö ¾ÊÀ¸¸ç, ¹®¹ýÀû ÆíÀǸ¦
À§ÇØ ±â¾ïºÎ·ù ÁöÁ¤ÀÚ·Î ºÐ·ùÇÕ´Ï´Ù.
¼±¾ð¿¡´Â ÃÖ´ë ÇѰ³ÀÇ ±â¾ïºÎ·ù ÁöÁ¤ÀÚ°¡ ÁÖ¾îÁ®¾ß ÇÕ´Ï´Ù. ¸¸¾à
ÁÖ¾îÁöÁö ¾Ê´Â´Ù¸é ´ÙÀ½°ú °°Àº ±ÔÄ¢ÀÌ Àû¿ëµË´Ï´Ù: ÇÔ¼ö ¾È¿¡¼ ¼±¾ðµÈ
´ë»óü´Â auto ·Î Ãë±ÞµË´Ï´Ù; ÇÔ¼ö ¾È¿¡¼ ¼±¾ðµÈ ÇÔ¼ö´Â extern À¸·Î
Ãë±ÞµË´Ï´Ù; ÇÔ¼ö ¹Û¿¡¼ ¼±¾ðµÈ ´ë»óü¿Í ÇÔ¼ö´Â ¿ÜºÎ¿¬°á (external
linkage) °ú Á¤Àû ±â¾ïºÎ·ù¸¦ °®½À´Ï´Ù. (A10 - A11 Âü°í)
¢¹ A8.2 ÇüÁöÁ¤ÀÚ (Type Qualifier)
ÇüÁöÁ¤ÀÚ´Â ´ÙÀ½°ú °°½À´Ï´Ù.
type-specifier:
void
char
short
int
long
float
double
signed
unsigned
struct-or-union-specifier
enum-specifier
typedef-name
|
long °ú short Áß Çϳª¸¸ÀÌ int ¿Í ÇÔ²² »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. long, short °¡
ÀÖÀ¸¸é int ¸¦ ½áÁÖÁö ¾Ê¾Æµµ Àǹ̴ int ÇüÀÔ´Ï´Ù. long Àº double °ú ÇÔ²²
¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù. signed ¿Í unsigned Áß Çϳª°¡ int, short int, long int,
char ¿Í ÇÔ²² ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù. signed ³ª unsigned °¡ È¥ÀÚ ³ªÅ¸³ª¸é int ÇüÀ¸·Î
Àνĵ˴ϴÙ. signed ÁöÁ¤ÀÚ´Â char Çü ´ë»óü°¡ ºÎÈ£ÀÖ´Â °ªÀ» °®µµ·Ï Çϴµ¥
À¯¿ëÇÕ´Ï´Ù; Á¤¼öÇü¿¡µµ signed ¸¦ ºÙÀÏ ¼ö´Â ÀÖÁö¸¸ Áߺ¹µÈ ¼±¾ðÀÔ´Ï´Ù.
À§ÀÇ °æ¿ì°¡ ¾Æ´Ï¶ó¸é, ÃÖ´ë 1°³ÀÇ ÇüÁöÁ¤ÀÚ¸¸ÀÌ ¼±¾ð¿¡ ³ª¿Ã ¼ö ÀÖ½À´Ï´Ù.
¼±¾ð¿¡ ÇüÁöÁ¤ÀÚ°¡ »ý·«µÇ¸é, int ÇüÀ¸·Î Ãë±ÞµË´Ï´Ù.
µ¥ÀÌÅÍÇüÀº ¼±¾ðµÈ ´ë»óü¿¡ Ưº°ÇÑ Æ¯¼ºÀ» ³ªÅ¸³»±â À§ÇØ ÇÑÁ¤µÇ±âµµ
(qualified) ÇÕ´Ï´Ù.
type-qualifier:
const
volatile
|
ÇüÇÑÁ¤¾î´Â ÇüÁöÁ¤ÀÚ¿Í ÇÔ²² ³ªÅ¸³¯ ¼ö ÀÖ½À´Ï´Ù. const ´ë»óü´Â ÃʱâÈ´Â µÇÁö¸¸
°ªÀÌ ´ëÀ﵃ ¼ö´Â ¾ø½À´Ï´Ù. volatile ·Î ÇÑÁ¤µÈ ´ë»óü¿¡ ´ëÇÑ »çÇ×Àº ÄÄÆÄÀÏ·¯¸¶´Ù
´Ù¸£°Ô Á¤ÀÇÇÕ´Ï´Ù (implementation-dependent).
| |
const ¿Í volatile ÀÇ Æ¯¼ºÀº ANSI ¿¡¼ »õ·ÎÀÌ
Á¤ÇÑ °ÍÀÔ´Ï´Ù. const ÀÇ ¸ñÀûÀº ´ë»óü°¡ ROM ¿¡ À§Ä¡ÇÒ ¼öµµ ÀÖÀ½À» ¾Ë·Á, ÃÖÀûÈÀÇ
±âȸ¸¦ Áõ°¡½ÃŰ´Â °ÍÀÔ´Ï´Ù. volatile ÀÇ ¸ñÀûÀº ÄÄÆÄÀÏ·¯¿¡°Ô ÃÖÀûȸ¦ ¾ïÁ¦Çϵµ·Ï
¾Ë¸®´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, ¸Þ¸ð¸® ¸ÊÇÎ ÀÔÃâ·Â (memory-mapping input/output) À»
ÇÏ´Â ±âÁ¾¿¡¼, ÀåÄ¡ ·¹Áö½ºÅÍ (device register) ¸¦ °¡¸£Å°´Â Æ÷ÀÎÅ͸¦ ÅëÇØ
ºÐ¸íÈ÷ Áߺ¹µÈ ÂüÁ¶¸¦ ÇÒ¶§, ÄÄÆÄÀÏ·¯°¡ À̸¦ ¾ø¾Ö´Â °ÍÀ» ¸·±â À§Çؼ ±× Æ÷ÀÎÅ͸¦
volatile ·Î ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù. const ´ë»óüÀÇ °ªÀ» º¯°æÇÏ·Á´Â ¸í¹éÇÑ
½Ãµµ¸¦ °Ë»çÇÏ´Â °ÍÀ» Á¦¿ÜÇϸé, ÄÄÆÄÀÏ·¯´Â ÀÌ·¯ÇÑ ÇÑÁ¤¾î¸¦ ¹«½ÃÇÒ ¼ö
ÀÖ½À´Ï´Ù. |
¢¹ A8.3 ±¸Á¶Ã¼¿Í °ø¿ëü ¼±¾ð (Structure and Union Declarations)
±¸Á¶Ã¼´Â ´Ù¾çÇÑ µ¥ÀÌÅÍÇüÀÇ ¿©·¯ ¸â¹ö¸¦ Æ÷ÇÔÇÏ´Â ´ë»óüÀÔ´Ï´Ù. °ø¿ëü´Â
´Ù¸¥ ½Ã°£¿¡ (µ¿½Ã¿¡´Â ºÒ°¡´ÉÇÏ´Ù´Â ¶æ) ´Ù¾çÇÑ µ¥ÀÌÅÍÇüÀÇ ¿©·¯ ¸â¹öÁß Çϳª¸¦
´ãÀ» ¼ö ÀÖ´Â ´ë»óüÀÔ´Ï´Ù. ±¸Á¶Ã¼ ÁöÁ¤ÀÚ¿Í °ø¿ëü ÁöÁ¤ÀÚ´Â °°Àº ÇüŸ¦ °®½À´Ï´Ù.
struct-or-union-specifiers:
struct-or-union identifier opt { struct-declaration-list }
struct-or-union identifier
struct-or-union:
struct
union
|
±¸Á¶Ã¼-¼±¾ð-¸®½ºÆ® (struct-declaration-list) ´Â ±¸Á¶Ã¼³ª °ø¿ëü ¸â¹öµéÀÌ
³ª¿µÈ °ÍÀÔ´Ï´Ù:
struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration
struct-declaration:
specifier-qualifier-list struct-declarator-list ;
specifier-qualifier-list:
type-specifier specifier-qualifier-list opt
type-qualifier specifier-qualifier-list opt
struct-declarator-list:
struct-declarator
struct-declarator-list , struct-declarator
|
º¸Åë, ±¸Á¶Ã¼-¼±¾ðÀÚ (struct-declarator) ´Â ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ¸â¹öµéÀ» À§ÇÑ
¼±¾ðÀÚÀÔ´Ï´Ù. ±¸Á¶Ã¼ ¸â¹ö´Â ¶ÇÇÑ ºñÆ®¼ö¸¦ ÁöÁ¤ÇÑ °ªÀ» Æ÷ÇÔÇϱ⵵ ÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ ¸â¹ö´Â ºñÆ®Çʵå (bit-field), ȤÀº µå¹É°Ô ±×³É Çʵå (field) ¶ó°í
ºÎ¸¨´Ï´Ù; ºñÆ®ÇʵåÀÇ ±æÀÌ´Â ¼±¾ðÀڷκÎÅÍ ÄÝ·Ð(:)À¸·Î ºÐ¸®µÇ¾î ÁöÁ¤µË´Ï´Ù.
struct-declarator:
declarator
declarator opt : constant-expression
|
¾Æ·¡¿Í °°Àº ÇüÅÂÀÇ ÇüÁöÁ¤ÀÚ´Â ¸íĪÀ», ¸®½ºÆ®¿¡ ÀÇÇØ ¼¼úµÈ ±¸Á¶Ã¼³ª °ø¿ëüÀÇ
Åà (tag) À¸·Î ¼±¾ðÇÕ´Ï´Ù.
| struct-or-union identifier { struct-declaration-list }
|
À§¿Í °°ÀÌ ¼±¾ðÀÌ µÇ¸é, °°°Å³ª ´õ ¾ÈÂÊÀÇ Åë¿ë¹üÀ§ (scope) ¿¡¼ ¸®½ºÆ® ¾øÀÌ Åø¸À»
»ç¿ëÇØ¼ °°Àº µ¥ÀÌÅÍÇüÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù:
| struct-or-union identifier
|
¸¸¾à, ¸®½ºÆ® ¾øÀÌ Åø¸ ÁöÁ¤µÇ°í ¶Ç ÀÌ ÅÃÀÌ Àü¿¡ ¼±¾ðµÈ ÀûÀÌ ¾ø´Ù¸é, ºÒ¿ÏÀüÇÑ Çü
(incomplete type) ÀÌ µË´Ï´Ù. ºÒ¿ÏÀüÇÑ ±¸Á¶Ã¼³ª °ø¿ëüÇüÀÇ ´ë»óü´Â
¼±¾ðÀ̳ª (Á¤ÀÇ´Â ¾ÈµÊ), Æ÷ÀÎÅÍ ÁöÁ¤, typedef »ý¼º°ú °°ÀÌ ±¸Ã¼ÀûÀÎ Å©±â¸¦ ÇÊ¿ä·Î
ÇÏÁö ¾Ê´Â °÷¿¡¼¸¸ ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù. ºÒ¿ÏÀüÇÑ ÇüÀº ¼±¾ð ¸®½ºÆ®¸¦ °®´Â µ¿ÀÏÇÑ ÅÃÀÇ
¼±¾ðÀÌ ³ªÅ¸³ª¸é ¿ÏÀüÇÑ ÇüÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. ºñ·Ï ¸®½ºÆ®¸¦ °®°í ÀÖ´Â ÁöÁ¤ÀÚ¶ó°í
ÇØµµ, ±¸Á¶Ã¼³ª °ø¿ëü´Â ¸®½ºÆ® ¾È¿¡¼´Â ºÒ¿ÏÀüÇÑ ÇüÀ̸ç, ÁöÁ¤ÀÚ¸¦ Á¾·á½ÃÄÑÁÖ´Â
} °¡ ³ª¿Í¾ß¸¸ ¿ÏÀüÇÑ ÇüÀÌ µË´Ï´Ù.
±¸Á¶Ã¼´Â ºÒ¿ÏÀüÇÑ ÇüÀÇ ¸â¹ö¸¦ Æ÷ÇÔÇÒ ¼ö ¾ø½À´Ï´Ù. µû¶ó¼ ÀÚ±â
ÀÚ½ÅÀ» Æ÷ÇÔÇÏ´Â, ±¸Á¶Ã¼³ª °ø¿ëü¸¦ ¼±¾ðÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÕ´Ï´Ù. ÇÏÁö¸¸
ºÒ¿ÏÀüÇÑ ÇüÀ» °¡¸£Å°´Â Æ÷ÀÎÅÍ´Â ¼±¾ðÇÒ ¼ö ÀÖ°í, ¶Ç ±¸Á¶Ã¼³ª °ø¿ëü´Â ÀÚ±â ÀÚ½ÅÀ»
ÂüÁ¶ÇÏ´Â Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÒ ¼ö Àֱ⠶§¹®¿¡, °á±¹ ÀÚ±âÂüÁ¶ ±¸Á¶Ã¼ (self-referential
structure) ¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù.
¼±¾ð ¸®½ºÆ® (declaration list) ¿Í ¼±¾ðÀÚ (declarator) ¾øÀÌ ±¸Á¶Ã¼¿Í
°ø¿ëü¸¦ ¼±¾ðÇÏ´Â ¾Æ·¡¿Í °°Àº ¼±¾ð¿¡´Â ¸Å¿ì Ưº°ÇÑ ±ÔÄ¢ÀÌ Àû¿ëµË´Ï´Ù.
| struct-or-union identifier;
|
¸íĪÀÌ ÀÌ¹Ì ¹Ù±ùÂÊ Åë¿ë¹üÀ§ (outer scope) ¿¡¼ ¼±¾ðµÈ ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ÅÃÀ̶ó°í
ÇØµµ, À§¿Í °°Àº ¼±¾ðÀº ÇöÀçÀÇ Åë¿ë¹üÀ§ ³»¿¡¼ ±× ¸íĪÀ» ºÒ¿ÏÀüÇÑ ÇüÀ» °®´Â
±¸Á¶Ã¼³ª °ø¿ëüÀÇ ÅÃÀ¸·Î ¸¸µé¾î ÁÝ´Ï´Ù.
| |
ÀÌ·¯ÇÑ ³ÇØÇÑ ±ÔÄ¢Àº »õ·Î¿î °ÍÀÔ´Ï´Ù. ÀÌ ±ÔÄ¢ÀÇ
¸ñÀûÀº ¹Ù±ù Åë¿ë¹üÀ§¿¡¼ ÀÌ¹Ì ¼±¾ðµÈ ÅÃÀ» °®´Â, ¾ÈÂÊ ¹üÀ§¿¡¼ ¼±¾ðµÈ
»óÈ£-Àç±ÍÀûÀÎ (mutually-recursive) ±¸Á¶Ã¼¸¦ ´Ù·ç±â À§ÇÑ °ÍÀÔ´Ï´Ù. |
 |
 |
¢º ¿ªÀÚ ÁÖ
»óÈ£ Àç±ÍÀûÀÎ ±¸Á¶Ã¼¶õ ´ÙÀ½°ú °°Àº °ÍÀ» ¸»ÇÕ´Ï´Ù.
struct x { int a; struct y *yp };
struct y { int b; struct x *xp }; |
ÀÌÁ¦ À§¿¡¼ À̾߱âÇÑ À̸¥¹Ù '³ÇØÇÑ ±ÔÄ¢'ÀÌ ÇÊ¿äÇÑ °æ¿ì¸¦ ¿¹·Î µé¾îº¸°Ú½À´Ï´Ù.
struct alpha { char c; };
struct beta { float f; };
int main()
{
struct alpha { int x; struct beta *b; } aa;
struct beta { int y; sttuct alpha *a; } bb;
aa.b = &bb;
bb.a = &aa;
return 0;
} |
À§ÀÇ ¿¹¿¡¼ ´ëÀÔ¹® aa.b = &bb ´Â Çã°¡µÇÁö ¾Ê½À´Ï´Ù. ±× ÀÌÀ¯´Â
±¸Á¶Ã¼ aa ¾È¿¡ ÀÖ´Â 'struct beta' °¡ main() ¹Û¿¡ ÀÖ´Â beta ¸¦
ÂüÁ¶Çϱ⠶§¹®ÀÔ´Ï´Ù. (¿ø·¡ Àǵµ´Â main() ¾ÈÀÇ alpha ¹Ø¿¡ ÀÖ´Â
beta ¸¦ ÂüÁ¶ÇÏ´Â °ÍÀÓ) ÀÌ¿Í °°Àº °æ¿ì main() ¾È¿¡ ÀÖ´Â alpha ¿Í
beta ÀÇ ¼±¾ð ¼ø¼¸¦ ¹Ù²ãµµ ¹®Á¦´Â ÇØ°áµÇÁö ¾Ê½À´Ï´Ù. ÀÌ·² ¶§,
main() ÇÔ¼öÀÇ º»Ã¼ ¾È¿¡¼ alpha, beta ¸¦ ¼±¾ðÇϱâ Àü¿¡ ´ÙÀ½°ú
°°Àº ¼±¾ðÀ» ³Ö¾îÁÖ¸é, À§¿¡¼ À̾߱âÇÑ '³ÇØÇÑ ±ÔÄ¢' ¿¡ ÀÇÇØ
ºí·°¹Û°ú´Â ´Ù¸¥ »õ·Î¿î ±¸Á¶Ã¼ alpha, beta °¡ ¼±¾ðµË´Ï´Ù.
struct alpha;
struct beta; |
¹°·Ð À§ÀÇ ¿¹´Â ºí·°¹ÛÀÇ alpha, beta °¡ ¸íÈ®È÷ ´«¿¡ º¸À̱â
¶§¹®¿¡ ¾î´À ÇÑÂÊÀ» °íÄ¡¸é »ó°ü¾øÁö¸¸, ºí·°¹ÛÀÇ ±¸Á¶Ã¼ ¼±¾ðÀÌ
´Ù¸¥ »ç¶÷ÀÌ ÀÛ¼ºÇÑ Çì´õÆÄÀÏ¿¡ ÆÄ¹¯Çô ÀÖ´Â °æ¿ì¶ó¸é ¹®Á¦°¡
µÉ ¼öµµ ÀÖ½À´Ï´Ù. |
|
 |
 |
ÅþøÀÌ ¸®½ºÆ®¸¸ ÀÖ´Â ±¸Á¶Ã¼ ¡¤ °ø¿ëü ÁöÁ¤ÀÚ´Â ÇϳªÀÇ Á¦´ë·ÎµÈ µ¥ÀÌÅÍÇüÀ»
¸¸µéÁö ¸øÇÕ´Ï´Ù; µû¶ó¼ ÀÌ·¯ÇÑ ±¸Á¶Ã¼³ª °ø¿ëü´Â ¿ÀÁ÷ ¼±¾ðµÇ´Â ºÎºÐ¿¡¼¸¸
Á÷Á¢ÀûÀ¸·Î ÂüÁ¶µÉ ¼ö ÀÖ½À´Ï´Ù.
¸â¹ö¸í°ú ÅøíÀº ¼·Î°£¿¡ ȤÀº ÀÏ¹Ý º¯¼ö¿Í Ãæµ¹ÇÏÁö ¾Ê½À´Ï´Ù.
µ¿ÀÏÇÑ ±¸Á¶Ã¼³ª °ø¿ëü¿¡ °°Àº ¸â¹ö¸íÀÌ µÎ¹ø ³ª¿Ã ¼ö´Â ¾øÁö¸¸, ´Ù¸¥ ±¸Á¶Ã¼¿¡´Â
µ¿ÀÏÇÑ ¸â¹ö¸íÀÌ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.
| |
ÀÌ Ã¥ÀÇ ÃÊÆÇ¿¡¼´Â, ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ¸â¹ö¸íÀÌ
±×°ÍÀÇ Åðú´Â ¾Æ¹«·± °ü°è°¡ ¾ø¾ú½À´Ï´Ù. ÇÏÁö¸¸, ÀÌ·¯ÇÑ Åðú ¸â¹ö¸íÀÇ °ü°è´Â
ANSI Ç¥ÁØ¾È ÀÌÀüºÎÅÍ ¿©·¯ ÄÄÆÄÀÏ·¯¿¡°Ô´Â º¸ÆíÀûÀÎ °ÍÀ̾ú½À´Ï´Ù. |
±¸Á¶Ã¼³ª °ø¿ëüÀÇ ºñÆ®Çʵ尡 ¾Æ´Ñ ¸â¹ö´Â ¾î¶°ÇÑ µ¥ÀÌÅÍÇüÀ» °¡Á®µµ
ÁÁ½À´Ï´Ù. (¼±¾ðÀÚ°¡ ÇÊ¿ä¾ø°í, µû¶ó¼ À̸§ÀÌ ºÙÁö ¾Ê¾Æµµ µÇ´Â) ºñÆ®Çʵå
¸â¹ö´Â int, unsigned int ȤÀº signed int ÇüÀ» °®À¸¸ç, ÁÖ¾îÁø ºñÆ®¸¸ÅÀÇ ±æÀ̸¦
°®´Â Á¤¼ö ´ë»óü (integral) ·Î ÇØ¼®µË´Ï´Ù; int Çü ºñÆ®Çʵ尡 ºÎÈ£ÀÖ´Â µ¥ÀÌÅÍÇüÀ¸·Î
´Ù·ç¾îÁö´ÂÁö´Â ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¨´Ï´Ù (implementation-dependent). ±¸Á¶Ã¼ÀÇ ÀÎÁ¢ÇØ ÀÖ´Â ºñÆ®Çʵå
¸â¹öµéÀº ÄÄÆÄÀÏ·¯°¡ Á¤ÇÑ ¹æÇâÀ¸·Î, ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¥ ±â¾ï´ÜÀ§ (storage unit)
·Î ¹ÀÔ´Ï´Ù. ºñÆ®Çʵ尡 ºÎºÐÀûÀ¸·Î ä¿öÁø ±â¾ï´ÜÀ§¿¡ ¸ÂÁö ¾ÊÀ» °æ¿ì,
µÎ ±â¾ï´ÜÀ§¿¡ °ÉÃÄ ºÐ¸®µÇ¾î ÀúÀåµÉ ¼öµµ ÀÖ°í, ºÎºÐÀûÀ¸·Î ä¿öÁø ±â¾ï´ÜÀ§¸¦
¹«ÀǹÌÇÑ °ªÀ¸·Î ä¿ö¼ (padding) ¹ö¸± ¼öµµ ÀÖ½À´Ï´Ù.
 |
 |
¢º ¿ªÀÚ ÁÖ
padding À̶õ, ¾µ¸ð¾ø´Â ±â¾ïÀå¼Ò¿¡ ¹«ÀǹÌÇÑ °ªÀ» ä¿ö¼
ÇÊ¿ä¾ø´Â ºÎºÐÀ» ¹ö¸®´Â ÀÛ¾÷À» ÀǹÌÇÕ´Ï´Ù. |
|
 |
 |
±æÀÌ 0 À» °®´Â À̸§¾ø´Â ºñÆ®Çʵå´Â ÀÌ·¸°Ô ÇÊ¿ä¾ø´Â ºÎºÐÀ» ä¿ìµµ·Ï ÇØ¼,
´ÙÀ½¹ø ºñÆ®Çʵ尡 »õ·Î¿î ±â¾ï´ÜÀ§ºÎÅÍ ½ÃÀÛÇϵµ·Ï ÇØÁÝ´Ï´Ù.
| |
ANSI ´Â ºñÆ®Çʵå¿Í °ü·ÃµÈ ³»¿ëÀ» ÀÌÀüº¸´Ù ´õ¿í ÄÄÆÄÀÏ·¯¿¡
¸Ã°ÜµÎ¾ú½À´Ï´Ù (implementation-dependent). ÀÌ´Â °ð ºñÆ®Çʵå ÀúÀå°ú °ü·ÃµÈ ¾ð¾îÀÇ ±ÔÄ¢Àº ¹«Á¶°Ç ÄÄÆÄÀÏ·¯¿¡
´Þ·ÁÀÖ´Ù´Â ¶æÀÔ´Ï´Ù. ºñÆ®Çʵ尡 ÀÖ´Â ±¸Á¶Ã¼´Â (Çʵ带 ´Ù·ç±â À§ÇÑ ³»ºÎ ¸í·É¾î°¡
´õ º¹ÀâÇØÁö°í, Çʵ忡 Á¢±ÙÇÏ´Â ½Ã°£ÀÌ ±æ¾îÁø´Ù°í ÇØµµ) ºñÆ®Çʵ带 À§ÇÑ
±â¾ïÀå¼Ò¸¦ ÁÙÀÌ´Â À̽ļºÀÖ´Â ¹æ¹ý (portable way) À¸·Î ´Ù·ç±âµµ Çϰí, ºñÆ® ¼öÁØ¿¡¼
¾Ë¾Æº¸±â ½¬¿î À̽ļº¾ø´Â ¹æ¹ý (non-portable way) À¸·Î ´Ù·ç±âµµ ÇÕ´Ï´Ù. µÎ¹øÂ°
°æ¿ì¶ó°í ÇØµµ, °¢ ÄÄÆÄÀÏ·¯ÀÇ ±ÔÄ¢À» µû·Î ¾Ë¾Æ¾ß ÇÕ´Ï´Ù. |
±¸Á¶Ã¼ÀÇ ¸â¹ö´Â ¼±¾ðµÈ ¼ø¼´ë·Î ¸Þ¸ð¸®»óÀÇ ÁÖ¼Ò°¡ Áõ°¡µÇ¾î ÀúÀåµË´Ï´Ù.
ºñÆ®Çʵ尡 ¾Æ´Ñ ±¸Á¶Ã¼ ¸â¹ö´Â ±× ¸â¹öÀÇ µ¥ÀÌÅÍÇü¿¡ µû¸¥ ÁÖ¼Ò¸¦ °æ°è·Î Á¤·ÄµË´Ï´Ù;
µû¶ó¼ ±¸Á¶Ã¼ ³»¿¡´Â ¸íĪÀÌ ºÙÁö¾ÊÀº ºó°ø°£ (hole) ÀÌ »ý±æ ¼ö ÀÖ½À´Ï´Ù.
±¸Á¶Ã¼¸¦ °¡¸£Å°´ø Æ÷ÀÎÅͰ¡ ù¹øÂ° ¸â¹ö¸¦ °¡¸£Å°´Â Æ÷ÀÎÅÍÇüÀ¸·Î ij½ºÆ® µÈ´Ù¸é,
°á°ú´Â ù¹øÂ° ¸â¹ö¸¦ ÂüÁ¶ÇÕ´Ï´Ù.
°ø¿ëü´Â ¸â¹ö°¡ ¸ðµÎ »ó´ë¹øÁö (offset) 0 ¿¡¼ ½ÃÀÛÇϰí, ¸â¹öÁß ¾î¶°ÇÑ °Íµµ
ÀúÀåÇÒ ¼ö ÀÖ´Â ÃæºÐÇÑ Å©±â¸¦ °®´Â ±¸Á¶Ã¼¶ó°í »ý°¢ÇÏ¸é µË´Ï´Ù. °ø¿ëü¿¡´Â
¸â¹öÁß Çϳª¸¸À» ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à °ø¿ëü¸¦ °¡¸£Å°´ø Æ÷ÀÎÅͰ¡
¾î¶°ÇÑ ¸â¹ö¸¦ °¡¸£Å°´Â Æ÷ÀÎÅÍÇüÀ¸·Î ij½ºÆ® µÈ´Ù¸é, °á°ú´Â ±× ¸â¹ö¸¦ ÂüÁ¶ÇÕ´Ï´Ù.
±¸Á¶Ã¼ ¼±¾ðÀÇ °£´ÜÇÑ ¿¹´Â ´ÙÀ½°ú °°½À´Ï´Ù.
struct tnode {
char tword[20];
int count;
struct tnode *left;
struct tnode *right;
};
|
ÀÌ ±¸Á¶Ã¼´Â ¹®ÀÚ 20°³¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â ¹è¿, Á¤¼öÇü (integer), ÀÚ±â ÀÚ½ÅÀ» ÂüÁ¶ÇÏ´Â Æ÷ÀÎÅÍ
2°³¸¦ ´ã°í ÀÖ½À´Ï´Ù. ¿ì¼± À§¿Í°°Àº ¼±¾ðÀÌ ÁÖ¾îÁö¸é, ´ÙÀ½°ú °°Àº ¼±¾ðÀº, s ¸¦ ÁÖ¾îÁø
Á¾·ùÀÇ ±¸Á¶Ã¼·Î, sp ¸¦ ÁÖ¾îÁø Á¾·ùÀÇ ±¸Á¶Ã¼ Æ÷ÀÎÅÍ·Î ¼±¾ðÇØ ÁÝ´Ï´Ù.
struct tnode s, *sp;
À§¿Í °°Àº ¼±¾ðÀÌ ÁÖ¾îÁö¸é, ¼ö½Ä
sp -> count
´Â sp °¡ °¡¸£Å°´Â ±¸Á¶Ã¼ÀÇ count ¸â¹ö¸¦ ÂüÁ¶ÇÕ´Ï´Ù;
sp.left
À§ÀÇ ¼ö½ÄÀº ±¸Á¶Ã¼ s ÀÇ ÁÂÃø ºÎºÐÆ®¸® (subtree) ¸¦ ÂüÁ¶ÇÕ´Ï´Ù;
s.right -> tword[0]
±×¸®°í À§ ¼ö½ÄÀº s ÀÇ ¿ìÃø ºÎºÐÆ®¸®ÀÇ tword ÀÇ Ã¹¹øÂ° ¹®ÀÚ¸¦ °¡¸£Åµ´Ï´Ù.
ÀϹÝÀûÀ¸·Î, °ªÀÌ ´ëÀÔµÇÁö ¾ÊÀº °ø¿ëüÀÇ ¸â¹ö´Â Á¶»çÇÒ ¼ö°¡ ¾ø½À´Ï´Ù.
ÇÏÁö¸¸ ÇѰ¡Áö »ç½ÇÀÌ È®½ÇÈ÷ º¸ÀåµÇ¾î ÀÖ¾î¼, °ø¿ëüÀÇ »ç¿ëÀ» ÆíÇÏ°Ô ÇØÁÝ´Ï´Ù:
¸¸¾à °ø¿ëü°¡ °°Àº Ãʱâ¸â¹ö (initial sequence) ¸¦ °øÀ¯ÇÏ´Â ¿©·¯°³ÀÇ ±¸Á¶Ã¼¸¦
Æ÷ÇÔÇϰí ÀÖ°í, ÇöÀç »ç¿ëÁßÀÎ °ø¿ëü°¡ ÀÌ ±¸Á¶Ã¼Áß Çϳª¸¦ Æ÷ÇÔÇÑ´Ù¸é, Æ÷ÇÔµÈ
±¸Á¶Ã¼Áß ¾î¶°ÇÑ (°øÅëµÈ) Ãʱâ¸â¹ö¶óµµ ÂüÁ¶ÇÏ´Â °ÍÀÌ Çã°¡µÇ¾î ÀÖ½À´Ï´Ù.
¿¹¸¦ µé¾î, ¾Æ·¡¿Í °°Àº °æ¿ì´Â Àû¹ýÇÑ °ÍÀÔ´Ï´Ù:
union {
struct {
int type;
} n;
struct {
int type;
int intnode;
} ni;
struct {
int type;
float floatnode;
} nf;
} u;
...
u.nf.type = FLOAT;
u.nf.floatnode = 3.14;
...
if (u.n.type == FLOAT)
... sin(u.nf.floatnode) ...
|
¢¹ A8.4 ¿°Å (Enumeration)
¿°Å´Â ¿°ÅÀÚ (enumerator) ¶ó°í ºÒ¸®´Â, À̸§ÀÌ ºÙ¾îÀÖ´Â »ó¼öÀÇ ÁýÇÕ³»¿¡¼
°ªÀÌ º¯ÇÏ´Â µ¶Æ¯ÇÑ µ¥ÀÌÅÍÇü ÀÔ´Ï´Ù. ¿°Å ÁöÁ¤ÀÚ (enumeration specifier) ÀÇ ÇüÅ´Â
±¸Á¶Ã¼ ¡¤ °ø¿ëü ÁöÁ¤ÀÚÀÇ ÇüÅÂ¿Í ºñ½ÁÇÕ´Ï´Ù.
enum-specifiers:
enum identifier opt { enumerator-list }
enum identifier
enumerator-list:
enumerator
enumerator-list , enumerator
enumerator:
identifier
identifier = constant-expression
|
¿°ÅÀÚ ¸®½ºÆ® (enumerator list) ÀÇ ¸íĪÀº int ÇüÀÇ »ó¼ö·Î ¼±¾ðµÇ°í, »ó¼ö°¡
¿ä±¸µÇ´Â °÷¿¡ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ¿°ÅÀÚ¿¡ = °¡ ¾øÀ¸¸é, ´ëÀÀÇÏ´Â »ó¼öÀÇ
°ªÀº, 0 ¿¡¼ ½ÃÀÛÇÏ°í ¿ÞÂÊ¿¡¼ ¿À¸¥ÂÊÀ¸·Î °¡¸é¼ 1¾¿ Áõ°¡µË´Ï´Ù. = °¡ ÁÖ¾îÁø
¿°ÅÀÚ´Â °ü·ÃµÈ ¸íĪ¿¡ ¸í½ÃµÈ °ªÀ» ´ëÀÔÇØ ÁÝ´Ï´Ù; = °¡ ¾øÀÌ À̾îÁö´Â ¸íĪÀº
ÀÌÀü¿¡ ´ëÀÔµÈ °ªºÎÅÍ °è¼ÓÇØ¼ Áõ°¡ÇÕ´Ï´Ù.
°°Àº Åë¿ë¹üÀ§ (scope) ³»¿¡ ÀÖ´Â ¿°ÅÀÚ ¸íĪÀº, ¼·Î°£¿¡ ȤÀº º¸ÅëÀÇ
º¯¼öµé°ú ±¸ºÐµÇ¾î¾ß ÇÕ´Ï´Ù. ÇÏÁö¸¸ °ªÀº ±¸ºÐµÉ Çʿ䰡 ¾ø½À´Ï´Ù.
¿°Å-ÁöÁ¤ÀÚ (enum-specifier) ¿¡ ÁÖ¾îÁø ¸íĪ (identifier) ÀÇ ¿ªÇÒÀº
±¸Á¶Ã¼-ÁöÁ¤ÀÚ (struct-specifier) ÀÇ ±¸Á¶Ã¼ Åðú À¯»çÇÕ´Ï´Ù; Áï Æ¯º°ÇÑ ¿°Å¸¦
¸í¸íÇÏ°Ô µË´Ï´Ù. Åðú ¸®½ºÆ®°¡ ÀÖµç ¾øµç ¿°Å-ÁöÁ¤ÀÚ (enum-spicifier) ÀÇ ±ÔÄ¢Àº
±¸Á¶Ã¼ ¡¤ °ø¿ëü ÁöÁ¤ÀÚ¿Í °°½À´Ï´Ù. ´Ü ºÒ¿ÏÀüÇÑ ¿°ÅÇü (incomplete
enumeration type) Àº Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù; µû¶ó¼ ¿°ÅÀÚ ¸®½ºÆ®°¡ ¾ø´Â
¿°Å-ÁöÁ¤ÀÚÀÇ ÅÃÀº, Åë¿ë¹üÀ§ ¾ÈÀÇ ¸®½ºÆ®°¡ ÀÖ´Â ÁöÁ¤ÀÚ¸¦ ÂüÁ¶Çؾ߸¸
ÇÕ´Ï´Ù.
| |
¿°ÅÇüÀº ÀÌ Ã¥ÀÇ ÃÊÆÇ ÀÌÈÄ »õ·Î¿î °ÍÀÌÁö¸¸,
ÀÌ¹Ì ¿©·¯Çص¿¾È C ¾ð¾îÀÇ ÇÑ ºÎºÐÀ̾ú½À´Ï´Ù. |
|