preprocessor directives
preprocessor๋ ์ผ๋ฐ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ธฐ ์ ์ preprocessor directives๋ฅผ ์ฒ๋ฆฌํ๋ค.
preprocessor directives๋ ์ ์ฒ๋ฆฌ๊ธฐ ์ง์์๋ผ๊ณ ํ๋ฉฐ,
'#'์ผ๋ก ์์ํ์ฌ ๊ฐํ๋ฌธ์๋ก ๋๋๋ค. (์ธ๋ฏธ์ฝ๋ก ๋ถํ์, ๊ฐํ ์ง์ '\'์ ์ฐ๋ฉด ๋ค์ ์ค์ ์ฐ๊ฒฐ ๊ฐ๋ฅ)
๋ค์ํ ์ข ๋ฅ๊ฐ ์์ผ๋ฉฐ ๋ค์ํ ์ฉ๋๋ก ์ฐ์ผ ์ ์์ผ๋ ์ฌ๊ธฐ์๋ ์์ฃผ ์ฐ์ด๋ ์ธ ๊ฐ์ง ์ฉ๋๋ง ์๊ฐํ๋ค.
1) Source file inclusion (#include)
#include <header>
#includ "file"
preprocessor๋ #include ์ง์์๋ฅผ ๋ง๋๋ฉด
๋ค์ ๋ช ์๋ ํค๋๋ ํ์ผ์ ์ง์์ ์์น์ ๋ณต์ฌํด ๋์ฒดํ๋ค.
๋ ๊ฐ์ง ํํ๋ก ์ฌ์ฉํ ์ ์๋๋ฐ,
implementation ์ ์ปดํ์ผ๋ฌ์ ํจ๊ป ์ ๊ณต๋๋ ํค๋๋ฅผ incluldeํ ๋๋ <>,
์์ค ํ์ผ์ด ์๋ ๋๋ ํฐ๋ฆฌ์ ์๋ ํ์ผ์ includeํ ๋๋ ""์ ์ฌ์ฉํ๋ค.
ํด๋น ๋๋ ํฐ๋ฆฌ์์ file์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ๋ ""๋ฅผ <>๋ก ๋์ฒดํ๋ค.
2) Macro definitions (#define, #undef)
#define identifier replacement
preprocessor๊ฐ #define ์ง์์๋ฅผ ๋ง๋๋ฉด
๋ค์ ๋์ค๋ ์ฝ๋์์ identifier๊ฐ ๋์ฌ ๋๋ง๋ค replacement๋ก ๋์ฒดํ๋ค.
#define TABLE_SIZE 10
int table1[TABLE_SIZE];
int table2[TABLE_SIZE];
#define getmax(a, b) a > b ? a : b
ํํ๋ ๋์ผํ์ง๋ง ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ฐ,
๋ง์น ์์์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๊ณ (์ด ๊ฒฝ์ฐ ๋์ฒด๋ก identifier๋ฅผ ๋๋ฌธ์๋ก ํ๊ธฐ)
๋ง์น ํจ์์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๋ค. (function macro๋ผ๊ณ ํจ)
function macro์์๋ replacement์ ๋ ๊ฐ์ง ํน๋ณ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ,
# ์ฐ์ฐ์๋ ๋ฐ๋ก ๋ค์ ์ค๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์คํธ๋ง ์ฒ๋ฆฌํด์ฃผ๋ฉฐ
## ์ฐ์ฐ์๋ ๋ ํ๋ผ๋ฏธํฐ๋ฅผ (๊ณต๋ฐฑ ์์ด) ์ฐ๊ฒฐํด์ค๋ค.
#define str(x) #x
cout << str(test); // cout << "test";
#defie glue(a, b) a ## b
glue(c, out) << "test"; // cout << "test";
#define ์ง์์๋ #undef ์ง์์๊ฐ ๋์ค๊ธฐ ์ ๊น์ง ์ง์๋๋ค. ์๋ฅผ ๋ค์ด,
#define TABLE_SIZE 10
int table1[TABLE_SIZE]; // int table1[10];
#undef TABLE_SIZE
#define TABLE_SIZE 20
int table2[TABLE_SIZE]; // int table2[20];
๋จ, ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ผ๋ ๋๋ฌด ๋งคํฌ๋ก์ ์์กดํ์ง ์๋๋ก ํด์ผํ๋ค.
3) Conditional inclusions (#ifdef, #ifndef, #if, #elif, #else, #endif)
preprocessor๊ฐ ์ด ์ง์์๋ค์ ๋ง๋๋ฉด
์ด๋ค ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฝ๋ ๋ธ๋ญ์ (์ปดํ์ผ ๋์์) ํฌํจํ ์ง ํฌํจํ์ง ์์ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
#ifdef TABLE_SIZE
int table[TABLE_SIZE];
#endif
#ifndef TABLE_SIZE
#define TABLE_SIZE 10
#endif
int table[TABLE_SIZE];
#ifdef ์ง์์๋ ๋ค์ ๋์ค๋ identifier๊ฐ ์์์ ์ด๋ฏธ ์ ์๋์๋์ง๋ฅผ ํ์ธํ๋ค. (๊ฐ๊ณผ๋ ๊ด๊ณ ์์)
์ฐธ์ธ ๊ฒฝ์ฐ #endif ์ง์์๊ฐ ๋์ค๊ธฐ ์ ๊น์ง์ ์ฝ๋๊ฐ ์ปดํ์ผ ๋๋๋ก ํ๋ค.
#ifndef ์ง์์๋ #ifdef ์ง์์์ ๋ฐ๋๋ก ๋์ํ๋ค.
#if TABLE_SIZE > 20
#undef TABLE_SIZE
#define TABLE_SIZE 20
#elif TABLE_SIZE < 15
#undef TABLE_SIZE
#define TABLE_SIZE 15
#else
#undef TABLE_SIZE
#define TABLE_SIZE 10
#endif
#if, #elif, #else ์ง์์๋ ์ถ๊ฐ์ ์ผ๋ก identifier์ ๊ฐ๊น์ง ํ์ธํ๋ค.
๋ฐ๋ผ ๋์ค๋ ์กฐ๊ฑด๋ฌธ์ constant expressions์ macro expressions๋ง ๊ฐ๋ฅํ๋ค.
#if ์ง์์๋
ํน๋ณ ์ฐ์ฐ์ defined์ !defined๋ฅผ ์ด์ฉํด
#ifdef, #ifndef ์ง์์์ ํ๋์ ํ ์ ์๋ค.
์ฐจ์ด์ ์ #ifdef ์ง์์๋ก๋ ํ๋์ ์กฐ๊ฑด๋ง ํ์ธํ ์ ์์ง๋ง,
#if ์ง์์ + defined ์ฐ์ฐ์๋ก๋ ๋ ๊ฐ ์ด์์ ์กฐ๊ฑด์ ํ์ธํ ์ ์๋ค. (&&, || ์ด์ฉ)
References
'Problem Solving > C++ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C++ ์์ฐจ ์ปจํ ์ด๋ (vector, deque, list) (0) | 2020.05.31 |
---|---|
C++14 STL ์ฒ ์ ์ ๋ฌธ) vector (0) | 2020.05.20 |
C++ #3: call by value, address, reference (0) | 2019.12.06 |
C++ #2: reference variable (0) | 2019.12.05 |
C++ #1: iostream, namespace (0) | 2019.12.05 |
๋๊ธ