¢Ê 12ÀÏ: Àü󸮱â - ¸ÅÅ©·Î Á¤ÀÇ¿Í È®Àå


¢¹ A12. Àü󸮱â (Preprocessor)
  Àü󸮱â (preprocessing) ´Â, ¸ÅÅ©·Î ġȯ (macro substitution), Á¶°ÇºÎ ÄÄÆÄÀÏ (conditional compilation), ÆÄÀÏ Ã·°¡ (inclusion of named file) ¸¦ ¼öÇàÇÕ´Ï´Ù. # ·Î ½ÃÀÛÇϰí, °ø¹é¹®ÀÚ (white space) °¡ ºÙ±âµµ ÇÏ´Â ¶óÀÎ (line) Àº Àü󸮱â¿Í °ü·ÃÀÌ ÀÖ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¯ÇÑ ¶óÀο¡ Àû¿ëµÇ´Â ¹®¹ýÀº C ¾ð¾îÀÇ ¹®¹ý°ú´Â °ü·ÃÀÌ ¾ø½À´Ï´Ù; Àü󸮱â´Â ÇÁ·Î±×·¥ÀÇ ¾îµð¿¡¶óµµ ³ª¿Ã ¼ö ÀÖÀ¸¸ç, (Åë¿ë¹üÀ§¿Í »ó°ü¾øÀÌ) ±× ¿µÇâÀÌ ¹ø¿ª´ÜÀ§ (translation unit) ÀÇ ³¡±îÁö Áö¼ÓµË´Ï´Ù. ¶óÀÎÀÇ °æ°è´Â À¯È¿ÇÕ´Ï´Ù; Áï, °¢ ¶óÀÎÀº °³º°ÀûÀ¸·Î ºÐ¼®µË´Ï´Ù. (´Ü, A12.2 Àý¿¡¼­ ¶óÀÎÀ» ¿¬°áÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÕ´Ï´Ù) Àü󸮱âÀÇ ÅäÅ« (token) Àº C¾ð¾îÀÇ ¸ðµç ÅäÅ«, ȤÀº #include Áö½ÃÀÚ (A12.4) ¿¡ ÆÄÀϸí (file name) À¸·Î Á¦°øµÇ´Â ¹®ÀÚ¿­ÀÔ´Ï´Ù; °Ô´Ù°¡ ´Ù¸¥°Ô Á¤ÀǵÇÁö ¾ÊÀº ¸ðµç ¹®ÀÚ´Â ÅäÅ«À¸·Î ÃëÇØÁý´Ï´Ù. ÇÏÁö¸¸, Àü󸮱⠶óÀξȿ¡¼­, °ø¹é (space), ¼öÆòÅÇ (horizontal tab) ÀÌ ¾Æ´Ñ, ´Ù¸¥ °ø¹é¹®ÀÚ (white space) ÀÇ ¿µÇâÀº Á¤ÀǵÇÁö ¾Ê¾Ò½À´Ï´Ù (undefined).
  Àü󸮱⠱â´É ÀÚü´Â (ƯÁ¤ ÄÄÆÄÀÏ·¯¿¡¼­´Â ¸î¸î ¼ø¼­°¡ »ý·«µÇ±âµµ ÇÏ´Â) ¿©·¯°³ÀÇ ³í¸®Àû °úÁ¤ °¡¿îµ¥¼­ ÀϾ´Ï´Ù. ±× °úÁ¤ (phase) À̶õ ¾Æ·¡¿Í °°½À´Ï´Ù.

1. ¿ì¼±, A12.1 Àý¿¡¼­ ¼³¸íÇÏ´Â »ïÁßÀÚ (trigraph sequence) °¡ µ¿ÀÏÇÑ ÀǹÌÀÇ ¹®ÀڷΠġȯµË´Ï´Ù. ¶ÇÇÑ ¿î¿µÃ¼Á¦°¡ ¿ä±¸ÇÏ´Â °æ¿ì, ¼Ò½ºÆÄÀÏÀÇ °¢ ¶óÀÎ »çÀÌ¿¡ °³Ç๮ÀÚ (newline character) °¡ »ðÀԵ˴ϴÙ.
2. °³Ç๮ÀÚ (newline) ¾Õ¿¡ ÀÖ´Â ¹é½½·¯½¬ ¹®ÀÚ \ °¡ Á¦°ÅµÇ°í, µÎ ¶óÀÎÀÌ ¿¬°áµË´Ï´Ù. (A12.2)
3. ÇÁ·Î±×·¥ ¼Ò½º°¡ °ø¹é¹®ÀÚ (white space) ·Î ºÐ¸®µÈ ÅäÅ« (token) À¸·Î ºÐ¼®µË´Ï´Ù; ÀÌ ¶§ ÁÖ¼®Àº ÇϳªÀÇ °ø¹é (space) À¸·Î ġȯµË´Ï´Ù. ±×·± ÈÄ¿¡, Àü󸮱â Áö½ÃÀÚ (preprocessing directive) ¿¡ µû¶ó ÇൿÇϰí, ¸ÅÅ©·Î (A12.3 ¡­ A12.10) °¡ È®ÀåµË´Ï´Ù.
4. ¹®ÀÚ»ó¼ö¿Í ¹®ÀÚ¿­ (A2.5.2, A2.6) ³»ÀÇ È®Àå¿­ (escape sequence) ÀÌ µ¿ÀÏÇÑ ÀǹÌÀÇ ¹®ÀڷΠġȯµÇ°í, ÀÎÁ¢ÇØ ÀÖ´Â ¹®ÀÚ¿­ÀÌ ¿¬°áµË´Ï´Ù.
5. ÇÊ¿äÇÑ ÇÁ·Î±×·¥ µ¥ÀÌÅ͸¦ ¼öÁýÇϰí, ¿ÜºÎ ÇÔ¼ö¿Í ´ë»óü ÂüÁ¶ (object reference) ¸¦ Á¤ÀÇ (definition) ¿¡ ¿¬°áÇÔÀ¸·Î½á, °á°ú°¡ ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ¹ø¿ªµÇ°í, ´Ù¸¥ ÇÁ·Î±×·¥, ¶óÀ̺귯¸® (library) ¿Í ÇÔ²² ¸µÅ© (link) µË´Ï´Ù.

  ¢¹ A12.1 »ïÁßÀÚ (Trigraph Sequence)
  C ÇÁ·Î±×·¥ ¼Ò½ºÀÇ ¹®ÀÚ¼¼Æ® (character set) ´Â 7ºñÆ® ASCII Äڵ峻¿¡ Æ÷ÇÔµÇÁö¸¸, ISO 646-1983 Invariant Code Set º¸´Ù Å« ¹®ÀÚ¼¼Æ®ÀÔ´Ï´Ù. (Áï, ÁýÇÕÀ¸·Î Ç¥ÇöÇϸé, 7ºñÆ® ASCII ÄÚµå ¡ù C ¼Ò½º ¹®ÀÚ¼¼Æ® ¡ù ISO 646-1983 Invariant Code Set ÀÔ´Ï´Ù)

¢º ¿ªÀÚ ÁÖ
  ISO 646 Àº 1983³â ISO ¿¡ ÀÇÇØ Ç¥ÁØÈ­µÈ 82ÀÚÀÇ ±âº» ¹®ÀÚ¼¼Æ® ÀÔ´Ï´Ù. C ¾ð¾îÀÇ ¼Ò½º¹®ÀÚ¼¼Æ®¿Í ½ÇÇ๮ÀÚ¼¼Æ® (source and execution character set) ´Â ISO 646 ¾ÈÀÇ ¹®ÀÚµéÀ» ¸ðµÎ Æ÷ÇÔÇØ¾ß ÇÕ´Ï´Ù. ÇÏÁö¸¸ ISO 646 ¹®ÀÚ¼¼Æ®´Â C ¾ð¾î¿¡¼­ »ç¿ëµÇ´Â ¸ðµç ¹®ÀÚ¸¦ ´ã°í ÀÖÁö ¾ÊÀ¸¸ç, ÀϺΠ¿Ü±¹¾îÀÇ ¹®ÀÚ¼¼Æ® ¿ª½Ã ¸¶Âù°¡ÁöÀÎ °æ¿ì°¡ ÀÖ½À´Ï´Ù.

ÇÁ·Î±×·¥À» ´õ ÀûÀº ¹®ÀÚ¼¼Æ®·Î Ç¥ÇöÇÒ ¼ö ÀÖµµ·Ï, ´ÙÀ½¿¡ ³ª¿À´Â ¸ðµç »ïÁßÀÚ (trigraph sequence) ´Â ´ëÀÀÇÏ´Â ÇϳªÀÇ ¹®ÀÚ·Î ´ëüµË´Ï´Ù. ÀÌ·¯ÇÑ »ïÁßÀÚÀÇ ´ëüÀÛ¾÷Àº ´Ù¸¥ ¾î¶² Àü󸮱â´É º¸´Ù ¿ì¼±ÇÕ´Ï´Ù.

??=   #           ??(   [           ??<   {
??/   \           ??)   ]           ??>   }
??'   ^           ??!   |           ??-   ~

  À§¿¡¼­ ³ª¿­µÈ »ïÁßÀÚ¿Ü¿¡ ´ëüÀÛ¾÷Àº ÀϾÁö ¾Ê½À´Ï´Ù.

  »ïÁßÀÚ´Â ANSI Ç¥ÁØ¿¡¼­ »õ·Î¿î °ÍÀÔ´Ï´Ù.

¢¹ A12.2 ¶óÀÎ ¿¬°á (Line Splicing)
  ¹é½½·¯½¬ \ ·Î ³¡³ª´Â ¶óÀÎÀº, ¹é½½·¯½¬¿Í ±× µÚ¿¡ µû¶ó¿À´Â °³Ç๮ÀÚ (newline) À» Á¦°ÅÇØ¼­ ´ÙÀ½ ¶óÀΰú ¿¬°áµË´Ï´Ù. ÀÌ·¯ÇÑ ¶óÀÎ ¿¬°áÀº ¼Ò½º°¡ ÅäÅ«À¸·Î ºÐ¼®µÇ±â Àü¿¡ ÀϾ´Ï´Ù.

¢¹ A12.3 ¸ÅÅ©·Î Á¤ÀÇ¿Í È®Àå (Macro Definition and Expansion)

# define identifier token-sequence

  À§¿Í °°Àº Á¦¾î¶óÀÎ (control line) Àº ÇÁ·Î±×·¥ ¼Ò½º¿¡ ³ªÅ¸³ª´Â ¸íĪ (identifier) À» ÁÖ¾îÁø ÅäÅ«¿­ (token-sequence) ·Î ¹Ù²ãÁÝ´Ï´Ù; ÅäÅ«¿­ÀÇ ¾ÕµÚ¿¡ ÀÖ´Â °ø¹é¹®ÀÚ (white space) ´Â Á¦°ÅµË´Ï´Ù. ÅäÅ« ¾È¿¡ ÀÖ´Â °ø¹é¹®ÀÚ±îÁö °í·ÁÇØ¼­, ÁÖ¾îÁø ÅäÅ«¿­ÀÌ µ¿ÀÏÇÏÁö ¾ÊÀ¸¸é, µ¿ÀÏÇÑ ¸íĪÀÇ Áߺ¹µÈ ¸ÅÅ©·Î°¡ ÁÖ¾îÁö´Â °ÍÀº À߸øµÈ °ÍÀÔ´Ï´Ù.

# define identifier( identifier-list opt ) token-sequence

  ù¹øÂ° ¸íĪ (identifier) °ú ¿©´Â °ýÈ£ ( »çÀÌ¿¡ °ø¹éÀÌ ¾ø¾î¾ß ÇÏ´Â, À§¿Í °°Àº ÇüÅÂÀÇ ¶óÀÎÀº ¸íĪ ¸®½ºÆ® (identifier-list) ¸¦ ¸Å°³º¯¼ö (parameter) ·Î °®´Â, ¸ÅÅ©·Î Á¤ÀÇÀÔ´Ï´Ù. ù¹øÂ° ÇüÅ¿¡¼­Ã³·³, ÅäÅ«¿­ ¾ÕµÚÀÇ °ø¹é¹®ÀÚ (white space) ´Â Á¦°ÅµÇ¸ç, ¸Å°³º¯¼öÀÇ °³¼ö¡¤Ã¶ÀÚ¿Í ÅäÅ«¿­ÀÌ µ¿ÀÏÇØ¾ß¸¸ ¸ÅÅ©·Î°¡ Áߺ¹ Á¤ÀÇµÉ ¼ö ÀÖ½À´Ï´Ù.

# undef identifier

  À§¿Í °°Àº Á¦¾î¶óÀÎ (control line) Àº ¸íĪÀÇ Àü󸮱â Á¤ÀǸ¦ ¾ø´ø °ÍÀ¸·Î ¸¸µé¾î ÁÝ´Ï´Ù. Á¤ÀǵÇÁö ¾ÊÀº ¸íĪ¿¡ #undef ¸¦ Àû¿ëÇÏ´Â °ÍÀº À߸øµÈ °ÍÀÌ ¾Æ´Õ´Ï´Ù.
  ¸ÅÅ©·Î°¡ µÎ¹øÂ° ÇüÅ·ΠÁ¤ÀǵǸé, ÇÁ·Î±×·¥ ¼Ò½º¿¡ ³ª¿À´Â ¸ÅÅ©·Î ¸íĪ (¸ÅÅ©·Î ¸íĪµÚ¿¡´Â, »ý·«°¡´ÉÇÑ °ø¹é¹®ÀÚ, ¿©´Â °ýÈ£, ½°Ç¥·Î ºÐ¸®µÈ ÅäÅ«¿­µé, ´Ý´Â °ýÈ£°¡ µû¶ó¿É´Ï´Ù) Àº ±× ¸ÅÅ©·Î¸¦ È£ÃâÇÕ´Ï´Ù. È£Ãâ½ÃÀÇ ÀÎÀÚ (argument) ´Â ½°Ç¥·Î ºÐ¸®µÈ ÅäÅ«¿­ÀÔ´Ï´Ù; µû¿ÈÇ¥¿¡ ½×¿© Àְųª, ÁßøµÈ °ýÈ£·Î º¸È£µÇ´Â (protected) ½°Ç¥´Â ÀÎÀÚ¸¦ ºÐ¸®ÇÏÁö ¾Ê½À´Ï´Ù. ¸ÅÅ©·Î ¸íĪÀ» °Ë»ç (scan) ÇÒ ¶§, ¸ÅÅ©·Î ÀÎÀÚ (argument) ¾È¿¡ ÀÖ´Â ¸ÅÅ©·Î´Â È®ÀåµÇÁö ¾Ê½À´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ¾Æ·¡¿Í °°Àº °æ¿ì, ÀÎÀÚ¿¡ ÀÖ´Â ¸ÅÅ©·Î FRAG ´Â (FOO ¸¦ È®ÀåÇÏ´Â °úÁ¤¿¡¼­ Áö¿öÁ® ¹ö¸®¹Ç·Î) ¾ß¿¹ È®ÀåµÇÁöµµ ¾Ê½À´Ï´Ù.

            #define FRAG 1
            #define FOO(x,y) (x)

            FOO(x,FRAG)

¸ÅÅ©·Î ÀÎÀھȿ¡ ÀÖ´Â ¸ÅÅ©·Î´Â ¹Ì¸® È®ÀåµÇÁö ¾Ê±â ¶§¹®¿¡, FRAG °¡ 1 ·Î È®ÀåµÇ±â Àü¿¡ FOO °¡ È®ÀåµÇ¸é¼­ FRAG ¸¦ ¾ø¾Ö¹ö¸®°Ô µË´Ï´Ù.

È£Ãâ½Ã ÀÎÀÚ (argument) ÀÇ °³¼ö´Â ¸ÅÅ©·Î Á¤ÀÇ¿¡ ÀÖ´Â ¸Å°³º¯¼ö (parameter) ÀÇ °³¼ö¿Í ÀÏÄ¡ÇØ¾ß¸¸ ÇÕ´Ï´Ù. È®Àå ÀÛ¾÷¿¡¼­, °¢ ÀÎÀÚÀÇ ¾ÕµÚ¿¡ ÀÖ´Â °ø¹é¹®ÀÚ (white space) ´Â Á¦°ÅµË´Ï´Ù. ±×·± ÈÄ¿¡, ÀÎÀÚ·Î ÁÖ¾îÁö´Â ÅäÅ«¿­µéÀº, ¸ÅÅ©·ÎÀÇ Ä¡È¯ ÅäÅ«¿­ (replacement token sequence) ¿¡¼­ ´ëÀÀÇÏ´Â ¸Å°³º¯¼ö (parameter) °¡ µû¿ÈÇ¥ ¾øÀÌ ³ª¿Ã ¶§¸¶´Ù ġȯµË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  µû¿ÈÇ¥ ¾È¿¡ ÀÖ´Â ¸Å°³º¯¼ö´Â ¹®ÀÚ¿­À̳ª ¹®ÀÚ»ó¼öÀÇ ÀϺηΠÃë±ÞµÇ±â ¶§¹®¿¡ È®ÀåµÇÁö ¾Ê½À´Ï´Ù. ¸¸¾à ÁÖ¾îÁö´Â ÀÎÀÚ¸¦ ¹®ÀÚ¿­·Î ¸¸µé°íÀÚ ÇÒ¶§´Â ´ÙÀ½¿¡ ¼³¸íÇÏ´Â # ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¸é µË´Ï´Ù.

ġȯ ÅäÅ«¿­¿¡ ³ª¿À´Â ¸Å°³º¯¼ö¿¡ # ³ª ## °¡ ºÙ¾îÀÖÁö ¾Ê´ÂÇÑ, ÀÎÀÚ·Î ÁÖ¾îÁö´Â ÅäÅ«Àº ¸ÅÅ©·Î È£ÃâÀ» À§ÇØ °Ë»çµÇ°í, »ðÀÔ (insertion) µÇ±â Àü¿¡ Çʿ信 µû¶ó È®ÀåµË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  Àü󸮱â´Â ÇÁ·Î±×·¥ ¼Ò½º»ó¿¡ º¸ÀÌ´Â ÅäÅ«ÀÇ ¸ÅÅ©·Î Á¤Àǰ¡ ÀÖ´ÂÁö ã¾Æº¸°í, ÀÖ´Ù¸é ±× ¸ÅÅ©·Î¸¦ È®ÀåÇØ ÁÝ´Ï´Ù. ´Ü # ¿¬»êÀÚÀÇ µÚ³ª, ## ¿¬»êÀÚ ¾ÕµÚ¿¡ ÀÖ´Â °ÍÀº ´Ù¸¥ ¸ÅÅ©·Î·Î Á¤ÀǵǾî ÀÖ´Ù°í ÇØµµ È®ÀåµÇÁö ¾Ê½À´Ï´Ù. (»õ·Î¿î ÅäÅ«À» ¸¸µé±â À§Çؼ­ ÀÔ´Ï´Ù)

            #define X Y
            #define A Z ## X

À§¿Í °°Àº »óÅ¿¡¼­ ¸ÅÅ©·Î A ¸¦ È£ÃâÇϸé, ZY °¡ ¾Æ´Ñ ZX ·Î ġȯµË´Ï´Ù.

  µÎ°³ÀÇ Æ¯º°ÇÑ ¿¬»êÀÚ°¡ ġȯ ÀÛ¾÷ (replacement process) ¿¡ ¿µÇâÀ» ÁÝ´Ï´Ù. ù°, ġȯ ÅäÅ«¿­ (replacement token sequence) ¿¡ ÀÖ´Â ¸Å°³º¯¼ö (parameter) ¾Õ¿¡ # °¡ ºÙ¾î ÀÖ´Ù¸é, ´ëÀÀÇÏ´Â ¸Å°³º¯¼ö ÁÖÀ§¿¡ ¹®ÀÚ¿­ µû¿ÈÇ¥(")°¡ µé¾î°¡°í, # ¿Í ¸Å°³º¯¼ö ¸íĪÀÌ ÀÎÀÚ (argument) ·Î ġȯµË´Ï´Ù. (ÀÎÀÚ¿¡ Æ÷ÇÔµÈ, ¹®ÀÚ¿­À̳ª ¹®ÀÚ»ó¼öÀÇ, ³»ºÎ ȤÀº ÁÖº¯¿¡ ÀÖ´Â " ³ª \ ¹®ÀÚ ¾Õ¿¡´Â \ °¡ Ãß°¡µË´Ï´Ù)

¢º ¿ªÀÚ ÁÖ
  " ³ª \ ¹®ÀÚ¾Õ¿¡ \ ¸¦ Ãß°¡ÇØ ÁÖ´Â °ÍÀº, ÁÖ¾îÁø ¹®ÀÚ¸¦ È®Àå¿­·Î ¸¸µé¾î ÁÖ±â À§Çؼ­ ÀÔ´Ï´Ù.

  µÑ°, µÎ Á¾·ùÀÇ ¸ÅÅ©·Î Á¤ÀÇ¿¡¼­, ġȯ ÅäÅ«¿­ (replacement token sequence) ÀÌ ## ¿¬»êÀÚ¸¦ Æ÷ÇÔÇÑ´Ù¸é, ¸Å°³º¯¼ö ġȯÀÌ ÀϾ ÈÄ¿¡ °ð¹Ù·Î, ## ¿Í ¾çÂÊÀÇ °ø¹é¹®ÀÚ (white space) °¡ Áö¿öÁ®¼­, ÀÎÁ¢ÇÑ ÅäÅ«ÀÌ ¿¬°áµÇ¾î ÇϳªÀÇ ÅäÅ«ÀÌ Çü¼ºµË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ´ç¿¬ÇÑ À̾߱â°ÚÁö¸¸, ´ÙÀ½°ú °°Àº °æ¿ì¸¦ »ý°¢ÇØ º¼ ¼ö ÀÖ½À´Ï´Ù.

            #define FOO 1
            #define BAR 2
            #define FOOBAR 3
            #define conexp(A,B) A ## B

            conexp(FOO,BAR)

À§¿¡¼­ conexp(FOO,BAR) ÀÇ È£Ãâ °á°ú´Â, 12 (FOO ÀÇ 1, BAR ÀÇ 2) °¡ ¾Æ´Ï¶ó 3 (FOOBAR ÀÇ 3) ÀÌ µË´Ï´Ù. À§¿¡¼­ À̾߱âÇßµíÀÌ, ¸Å°³º¯¼ö ġȯÀÌ ÀϾ ÈÄ¿¡ °ð¹Ù·Î µÎ°³ÀÇ ÅäÅ« (FOO ¿Í BAR) ÀÌ ¿¬°áµÇ¾î, ÇϳªÀÇ »õ·Î¿î ÅäÅ« (FOOBAR) À» Çü¼ºÇϱ⠶§¹®ÀÔ´Ï´Ù.

¸¸¾à, À¯È¿ÇÏÁö ¾ÊÀº ÅäÅ«ÀÌ »ý¼ºµÇ°Å³ª, °á°ú°¡ ## ¿¬»êÀÚÀÇ ÀÛ¾÷¼ø¼­¿¡ µû¶ó ´Þ¶óÁö´Â °æ¿ì¶ó¸é, ±× ¿µÇâÀº ¾Ë ¼ö ¾ø½À´Ï´Ù (undefined).

¢º ¿ªÀÚ ÁÖ
  C90 Ç¥Áؾȿ¡¼­, ## ¿¬»êÀÚÀÇ Æò°¡¼ø¼­´Â ¸í½ÃµÇÁö ¾Ê´Â´Ù°í (unspecified) µÇ¾î ÀÖ½À´Ï´Ù. ¸¸¾à ## ¿¬»êÀÚÀÇ ÀÛ¾÷¼ø¼­¿¡ ÀÇÁ¸ÀûÀÎ °æ¿ì, °¡´ÉÇÑ ¼ø¼­Áß Çϳª¶óµµ ºÎÀûÀýÇÑ Àü󸮱â ÅäÅ«À» »ý¼ºÇÑ´Ù¸é, ±× ÇൿÀ» ¾Ë ¼ö ¾ø°Ô µË´Ï´Ù (undefined).

            AA ## 11_ ## 22

À§¿Í °°Àº °æ¿ì 11_ ## 22 °¡ ¸ÕÀú Æò°¡µÇ¸é, ¿Ã¹Ù¸¥ ¼ýÀÚµµ ¸íεµ ¾Æ´Ñ ºÎÀûÀýÇÑ ÅäÅ«ÀÌ »ý¼ºµÇ¾î °á°ú¸¦ ¾Ë ¼ö ¾ø°Ô µË´Ï´Ù (undefined). ¹°·Ð AA ## 11_ ÀÌ ¸ÕÀú Æò°¡µÈ´Ù¸é °á°ú´Â À¯È¿ÇÑ ¸íĪÀÌ µÇ°í, 22 ¿Í ¿¬°áµÇ¾î ¿Ã¹Ù¸¥ °á°ú°¡ ³ª¿À°Ô µË´Ï´Ù.

¶ÇÇÑ ## ´Â ġȯ ÅäÅ«¿­ÀÇ ¸Ç¾ÕÀ̳ª ¸ÇµÚ¿¡ ³ªÅ¸³¯ ¼ö ¾ø½À´Ï´Ù.
  µÎ Á¾·ùÀÇ ¸ÅÅ©·Î Á¤ÀÇ¿¡¼­, ġȯ ÅäÅ«¿­ (replacement token sequence) Àº ´Ù¸¥ ¸ÅÅ©·Î Á¤ÀÇ ¸íĪÀ¸·Î ¹Ýº¹Çؼ­ °Ë»ç (scan) µË´Ï´Ù. ÇÏÁö¸¸, ġȯ ÅäÅ«¿­ ¾È¿¡ ±× ÅäÅ«¿­À» È®ÀåÇØÁÖ´Â ¸ÅÅ©·Î ¸íÀÌ µé¾î°¡ ÀÖ´Ù¸é (ÁßøµÈ ¸ÅÅ©·Î »çÀÌ¿¡ µé¾î ÀÖ´Ù°í ÇØµµ), Çѹø¸¸ È®ÀåµË´Ï´Ù. Áï, Àç°Ë»ç (rescan) ÇÒ ¶§ ±× ¸ÅÅ©·Î°¡ ´Ù½Ã ¹ß°ßµÈ´Ù°í ÇØµµ È®ÀåµÇÁö ¾Ê½À´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ´ÙÀ½°ú °°Àº °æ¿ì¸¦ ¸»ÇÏ´Â °ÍÀÔ´Ï´Ù.

            #define char unsigned char

À§¿Í °°ÀÌ ¸ÅÅ©·Î°¡ Á¤ÀǵǾî ÀÖ´Ù¸é, ÇÁ·Î±×·¥ ¼Ò½º»óÀÇ char ´Â unsigned char ·Î ġȯµË´Ï´Ù. ¸¸¾à À§¿¡¼­ ¼³¸íÇÑ ±ÔÄ¢ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é, unsigned char ÀÇ ÀϺκÐÀÎ char °¡ ¶Ç ¸ÅÅ©·Î·Î ÀνĵǴ ÀÏÀÌ ¹Ýº¹µÇ¹Ç·Î ¾ðÁ¨°¡´Â ½Ã½ºÅÛ ¿¡·¯·Î Àü󸮱â´ÉÀÌ Á¾·áµË´Ï´Ù. ÇÏÁö¸¸ À§¿¡¼­ À̾߱âÇÑ ±ÔÄ¢ÀÌ À̸¦ ¹æÁöÇØ Áֱ⠶§¹®¿¡ Çѹø¸¸ È®ÀåµÇ¾î unsigned char ±îÁö¸¸ È®ÀåÇØ ÁÝ´Ï´Ù.

            #define ONE IS TWO
            #define TWO ARE THREE TWO
            #define THREE WERE ONE

¶ÇÇÑ ¿©·¯¹ø ÁßøµÈ ¸ÅÅ©·Î »çÀÌ¿¡¼­µµ À§ÀÇ ±ÔÄ¢Àº Á¦´ë·Î Àû¿ëµË´Ï´Ù. µû¶ó¼­ À§¿Í °°ÀÌ ¸ÅÅ©·Î¸¦ Á¤ÀÇÇØ ³õÀº »óÅ¿¡¼­, ONE À» È£ÃâÇϸé Á¤È®Çϱâ IS ARE WERE ONE TWO ·Î¸¸ È®ÀåµË´Ï´Ù. (´õ º¹ÀâÇÏ°Ô ¸¸µé¸é ´õ ÀëÀÖ½À´Ï´Ù ^^;)

  ¸¸¾à ¸ÅÅ©·Î È®ÀåÀÇ ÃÖÁ¾ °á°ú°¡ # ·Î ½ÃÀÛÇÑ´Ù°í ÇØµµ, ÀÌ´Â Àü󸮱â Áö½ÃÀÚ·Î Ãë±ÞµÇÁö ¾Ê½À´Ï´Ù.

  ¸ÅÅ©·Î È®Àå ÀÛ¾÷ÀÇ »ó¼¼ÇÑ ³»¿ëÀº ÃÊÆÇº¸´Ù ANSI ¿¡¼­ ´õ ¼¼¹ÐÇÏ°Ô Á¤ÀÇÇß½À´Ï´Ù. °¡Àå Áß¿äÇÑ º¯È­´Â, ¹®ÀÚ¿­À» ¸¸µé¾î ÁÖ°í, ÅäÅ«À» ¿¬°áÇØ ÁÖ´Â # ¿Í ## ¿¬»êÀÚ¸¦ Ãß°¡ÇÑ °ÍÀÔ´Ï´Ù. »õ ±ÔÄ¢Áß ÀϺÎ, ƯÈ÷ ÅäÅ« ¿¬°á°ú °ü·ÃµÈ ºÎºÐÀº Á¶±Ý ƯÀÌÇÕ´Ï´Ù. (¾Æ·¡ ¿¹¸¦ º¸½Ã±â ¹Ù¶ø´Ï´Ù)

  ¿¹¸¦ µé¾î, ¾Æ·¡¿Í °°Àº ¸ÅÅ©·Î´Â "manifest constant" ¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁÝ´Ï´Ù.

            #define TABSIZE 100
            int table[TABSIZE];

¾Æ·¡¿Í °°Àº °æ¿ì´Â, µÎ ÀÎÀÚ »çÀÌÀÇ Â÷¸¦ Àý´ë°ªÀ¸·Î ¹ÝȯÇÏ´Â ¸ÅÅ©·Î¸¦ Á¤ÀÇÇØ ÁÝ´Ï´Ù.

            #define ABSDIFF(a, b)  ((a)>(b) ? (a)-(b) : (b)-(a))

µ¿ÀÏÇÑ ÀÏÀ» ´ã´çÇÏ´Â ÇÔ¼ö¿Í´Â ´Þ¸®, ¸ÅÅ©·Î·Î ÀÛ¼ºµÈ °æ¿ì¿¡´Â ÀÎÀÚ¿Í ¹Ýȯ°ªÀÌ ¾î¶°ÇÑ »ê¼úÇü (arithmetic type) À̳ª Æ÷ÀÎÅÍ (pointer) ¿©µµ »ó°ü¾ø½À´Ï´Ù. ¶ÇÇÑ ÁÖ¾îÁø ÀÎÀÚ´Â, °Ë»çÇϴµ¥ Çѹø, °ªÀ» »ý¼ºÇϴµ¥ Çѹø, ÃÑ µÎ¹ø Æò°¡µÇ¹Ç·Î ºÎÀÛ¿ë (side effect) ÀÌ ¹ß»ýÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
  ´ÙÀ½°ú °°Àº Á¤Àǰ¡ ÁÖ¾îÁö¸é,

            #define tempfile(dir)  #dir "/%s"

¸ÅÅ©·Î È£Ãâ tempfile(/usr/tmp) ´Â ¾Æ·¡¿Í °°Àº °á°ú¸¦ »ý¼ºÇÕ´Ï´Ù.

            "/usr/tmp" "/%s"

¶Ç À§ÀÇ °á°ú´Â ÇϳªÀÇ ¹®ÀÚ¿­·Î ¿¬°áµË´Ï´Ù. ´ÙÀ½°ú °°Àº ¸ÅÅ©·Î°¡ Á¤ÀǵǸé,

            #define cat(x, y)  x ## y

cat(var,123) ¿Í °°Àº È£ÃâÀº var123 À̶ó´Â ÅäÅ«À» »ý¼ºÇÕ´Ï´Ù. ÇÏÁö¸¸, cat(cat(1,2),3) ¿Í °°Àº È£ÃâÀº Á¤ÀǵǾî ÀÖÁö ¾Ê½À´Ï´Ù (undefined). ## ÀÇ Á¸Àç´Â ¹Ù±ùÂÊ È£ÃâÀÇ ÀÎÀÚ°¡ È®ÀåµÇÁö ¾Êµµ·Ï ÇØÁÝ´Ï´Ù. µû¶ó¼­ ´ÙÀ½°ú °°Àº ÅäÅ«ÀÌ »ý¼ºµË´Ï´Ù.

            cat ( 1 , 2 )3

¿©±â¼­ ù¹øÂ° ÀÎÀÚÀÇ ¸¶Áö¸· ÅäÅ«°ú µÎ¹øÂ° ÀÎÀÚÀÇ Ã¹¹øÂ° ÅäÅ«ÀÌ ¿¬°áµÈ )3 Àº Àû¹ýÇÏÁö ¾ÊÀº ÅäÅ«ÀÌ µË´Ï´Ù. ¸¸¾à ´ÙÀ½°ú °°ÀÌ µÎ´Ü°è¿¡ °ÉÃÄ ¸ÅÅ©·Î°¡ Á¤ÀǵǸé,

            #define xcat(x,y)  cat(x,y)

Á» ´õ À¯¿¬ÇÏ°Ô ÀÛµ¿ÇÕ´Ï´Ù; xcat ÀÇ È®Àå ÀÚü´Â ## ¿¬»êÀÚ¿Í °ü·ÃÀÌ ¾ø±â ¶§¹®¿¡, xcat(xcat(1, 2), 3) ´Â ¿Ã¹Ù¸£°Ô 123 À» »ý¼ºÇÕ´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  xcat(xcat(1,2),3) ÀÇ È®Àå°úÁ¤Àº ´ÙÀ½°ú °°½À´Ï´Ù.

´Ü°è º¯È¯ °á°ú
  1. (¿ø·¡»óÅÂ)       xcat(xcat(1,2),3)  
  2. (ÀÎÀÚÈ®Àå)   xcat(1,2)  
  cat(1,2)  
  12  
  3.   cat(12,3)  
  4. (¿Ï·á)   123  

À§¿¡¼­, °¡Àå ¹Ù±ùÂÊ È£Ãâ xcat() ÀÇ µÎ ÀÎÀÚ´Â xcat(1,2) ¿Í 3 À̸ç, ù¹øÂ° ÀÎÀÚÀÎ xcat(1,2) °¡ ¸ÅÅ©·Î È£ÃâÀ̹ǷΠġȯ ¸®½ºÆ®¿¡ »ðÀԵDZâ Àü¿¡ ¿ÏÀüÈ÷ È®ÀåµË´Ï´Ù.
  xcat(cat(1,2),3) ¿ª½Ã À§¿Í µ¿ÀÏÇÑ °úÁ¤À» °ÅÃÄ, 123 À¸·Î ¿ÏÀüÈ÷ È®ÀåµË´Ï´Ù. ÇÏÁö¸¸, cat(xcat(1,2),3) ÀÇ °æ¿ì¿¡´Â, ù¹øÂ° ÀÎÀÚÀÎ xcat(1,2) °¡ ## ÀÇ ¿µÇâÀ» Á÷Á¢ ¹Þ¾Æ¼­ È®ÀåµÇÁö ¾Ê±â ¶§¹®¿¡, cat(cat(1,2),3) ¿Í ¸¶Âù°¡Áö·Î À¯È¿ÇÏÁö ¾ÊÀº ÅäÅ«À» »ý¼ºÇÏ°Ô µË´Ï´Ù (undefined behavior).

  À¯»çÇϰÔ, ABSDIFF(ABSDIFF(a,b),c) ´Â ¿¹»óµÇ´Â´ë·Î ¿ÏÀüÇÏ°Ô È®ÀåµÈ °á°ú¸¦ »ý¼ºÇÕ´Ï´Ù.



ÀÌÀü [¡ã ¸ÇÀ§·Î]
[¢Ê ¸ñÂ÷·Î]
´ÙÀ½