C/C++์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด์
define์ผ๋ก ์์๋ ๋ฌธ์์ด์ ์ ์ํด๋ณธ ์ ์ด ํ ๋ฒ์ฏค์ ์์ ๊ฒ์ด๋ค
#include <iostream>
#define MAX_SIZE 1024
#define MAIN_NAME "test main"
using namespace std;
int main(void)
{
cout << MAX_SIZE << endl;
cout << MAIN_NAME << endl;
return 0;
}
CLI> ./test
1024
test main
์ด๋ฐ ์์ผ๋ก ใ ๋ฌธ์์ด์ด๋ ์ซ์๋ฅผ ๋์ฒดํ ๋ ๋ง์ด ์ด๋ค
๊ทผ๋ฐ ์์ฃผ ์ฐ๋ " #define "์ด๋ ์ด ์น๊ตฌ๊ฐ ์๊ฐ๋ณด๋ค ๋ง์ ๊ธฐ๋ฅ์ด ์๋๋ผ
๊ทธ๋์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค
1. ์ ์ฒ๋ฆฌ๊ธฐ(preprocessor)
์ง์ญํ์๋ฉด processor ์ด์ ์ด๋ผ๋ ๋ป์ธ๋ฐ, ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด
ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ค๊ณ ํ๋๋ฐ
ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ธฐ ์ ์ ๋จผ์ ์ฒ๋ฆฌ๋๋ ๊ฒ ์ ์ฒ๋ฆฌ๊ธฐ์ด๋ค
์ฐ๋ฆฌ์ ๊ณ ๊ธ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ๋ ๊ฝค ๋ณต์กํ ๊ณผ์ ์ด ์๋ค
์์ธํ ๋ด์ฉ์ ์ปดํ์ผ ๊ณผ์ ์ ์ดํด๋ณด๊ธธ ์ถ์ฒํ๋ค
์ด ์ค ์ ์ฒ๋ฆฌ๊ธฐ ๊ณผ์ ์ ์คํ ํ์ผ ์์ฑํ๋ ๊ณผ์ ์์
์์ค ํ์ผ์ ์ฌ๋ฌ ์ง์๋ฌธ์ ์ฐ์ ์ฒ๋ฆฌํ๋ ์์ ์ด๋ค
์ฝ๋ ์์ฑ X, ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ์ ํ ์ ์๋๋ก ์์ค๋ฅผ ์ฌ๊ตฌ์ฑํด์ฃผ๋ ์ญํ ์ด๋ค
์ ์ฒ๋ฆฌ๋๋๊ฑฐ๋ ์ด๋ค ๊ฒ ์๋๋ฉด
(1) ์ ์ฒ๋ฆฌ ์ง์์
(2) Macro
(3) ์กฐ๊ฑด๋ถ ์ปดํ์ผ (Conditional compilation)
...
๋ฑ๋ฑ์ด ์๋ค ใ
์ฌ์ค ์ค๋ macro๋ง ์ ๋ฆฌํ๋ ค๊ณ ํ๋๋ฐ ๋ง์ด ๊ณ์ ๋์ด๋๋ค;;
(1) ์ ์ฒ๋ฆฌ ์ง์์ (preprocessing directives)
ํ์ฌ๊ฐ ์ฐ๋ฆฌ๋ง์ ๋๋ฌด ์ด๋ ค์
์ ์ฒ๋ฆฌ ์ง์์๋ผ๋ ๋จ์ด๋ ์ด๋ ค์ ๋ณด์ด์ง๋ง,
์ฐ๋ฆฌ๊ฐ ๋ง์ด ์ฐ๋ #include, #define, #pragma, #ifndef ๋ฑ์ด๋ค ใ
#include
์๋ ํ๋ก๊ทธ๋จ ํ์ผ์ ์์น๋ฅผ ์ฒจ๋ถํ์ฌ ํ๋์ ํ์ผ์ฒ๋ผ ์ปดํ์ผํด์ฃผ๊ณ ,
ํค๋ ํ์ผ์ด๋ ๋ค๋ฅธ ํ์ผ์ ์๋ ์ ์ธ ๋ด์ฉ์ ๋ค๋ฅธ ํ์ผ๋ผ๋ฆฌ ์ฐ๊ฒฐํด์ค๋ค
์ฌ์ฉ ๋ฐฉ์์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค ใ
#include <iostream>
#include "MyClass.hpp"
ํ์ค ํค๋ ํ์ผ์ ์ปดํ์ผ์ ํฌํจํ ๋๋ <>๋ฅผ ์ฌ์ฉํ๊ณ
์ฐ๋ฆฌ๊ฐ ์์ฑํ ํค๋ ํ์ผ์ ํฌํจํ ๋๋ ""๋ฅผ ์ฌ์ฉํ๋ค
์ฌ์ค ์์ด ์จ๋ ๋๊ธด ํ๋๋ฐ, ํ์ค(?)์ ์ธ ๋ฌธ๋ฒ์ด๋ค
#define
์๋ ๊ธ์ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ์์์์ ์ฌ์ฉํ๋๋ฐ, ์์/๋ฌธ์์ด/ํจ์ ๋ฑ์ ๋จ์ํํด์ค๋ค
define ์์ฒด๋ ์ ์ํ๋ค๋ ๋ป์ด์ง ์์๊ฐ
์ข ๋ ๋ช ํํ๊ฒ ์ด๋ฆ์ ๋ถ์ฌ์ค๋ค~๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค
#define PERIMETER 3.14
int main(void)
{
int n = 3.14;
int n = PERIMETER;
...
์ด๋ฐ ์์ผ๋ก? ๊ทธ๋ฅ ์์ ์ฌ์ฉ๋ณด๋ค๋ ์ด๋ฆ ๋ถ์ฌ์ ์ฌ์ฉ ใ ใ
๊ทธ ๋ฐ์ ์ ์ฒ๋ฆฌ ์ง์์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค
(2) ๋งคํฌ๋ก ํจ์ (Macro function)
๋งคํฌ๋ก๋ ์ง์ญํ๋ฉด '๊ฑฐ๋ํ'์ด๋ ๋ป์ธ๋ฐ,
๋ง์ดํฌ๋ก(micro)์ ๋ฐ๋๋๋ ์๋ฏธ๋ก ๋ญ๊ฐ ํ๋์ ํฐ ๋จ์?๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค
์์์ ๋ค๋ฃฌ #define ์ง์์์ ํจ์ ์ ์๋ฅผ ์ ๋ฌํด์ ๋ง์น ํจ์์ฒ๋ผ ๋์ํ๊ฒ ํ ์ ์๋ค
#include <iostream>
#define PLUS(x) x+x
#define MUL(x) x*x
using namespace std;
int main(void)
{
cout << PLUS(5) << endl;
cout << MUL(5) << endl;
return 0;
}
์ด๋ฐ ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
ํจ์์ฒ๋ผ ์ธ์๋ฅผ ์ ๋ฌํด์ฃผ๋ ๋ชจ์์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค ใ
#define MY_PRINT(x)\
do{\
cout << "x๋ " << endl;\
cout << x << endl;\
}while(0)\
์ฌ๋ฌ ์ค์ด๋ผ๋ฉด do-while๋ฌธ์ ์ฌ์ฉํด์ ํํ๋ ๊ฐ๋ฅํ๋ค
๋์ "\"๋ฅผ ์จ์ ๊ฐํ ํ์ํด์ฃผ๋ ๊ฑฐ๋ ์์ง ๋ง์๊ธธใ
์๋ ์ฐธ ํธ๋ฆฌํจ
๊ทผ๋ฐ ์์ ์์์ ์ฌ์ฉํ ์์ ๊ณ์ฐ์์
๋งคํฌ๋ก ํจ์๋ก ๋ง๋ค ๋๋ ์ฃผ์ํด์ผ ํ ์ ์ด ํ๋ ์๋ค
#include <iostream>
#define PLUS(x) x+x
#define MUL(x) x*x
using namespace std;
int main(void)
{
int plus_ret = PLUS(5);
int mul_ret = MUL(5+5);
cout << plus_ret << endl;
cout << mul_ret << endl;
return 0;
}
CLI> ./test.out
10
35
๋กธ? ์ ์๋ ๊บผ๋ 35๋ก ์ฐํ๊น
10 * 10์ ์์ํ๊ฒ ์ง๋ง.. ์ ์ฒ๋ฆฌ๊ธฐ๋ ์นํํด์ค ๋ฟ์ด๋ค
์ฆ, MUL(X)๋ 5+5*5+5๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์
์ฌ์น์ฐ์ฐ ์ฐ์ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ์์๊ณผ ๋ค๋ฅด๊ฒ ๋์จ ๊ฒ์ด๋ค ใ
๊ทธ๋์ ์์์์ ๋ํด ๋งคํฌ๋ก๋ฅผ ์์ฑํ ๋๋
#define MUL(x) (x)*(x)
์ด๋ ๊ฒ ๊ดํธ๋ฅผ ๋ฌถ์ด์ ์ฌ์ฉํด์ผ ํ๋ค
# ์ฐ์ฐ์ ์ฌ์ฉ
์ ์ฒ๋ฆฌ ์ง์์์๋ #์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ ๋จ์ ์ฐ์ฐ์ ์ฌ์ฉํ ์ ์๋ค
#include <iostream>
#define PLUS(X)\
do{\
cout << ""#X"์ ๋ง์
์" << ((X)*(X)) << "์
๋๋ค." << endl;\
}while(0)\
using namespace std;
int main(void)
{
PLUS(5);
PLUS(3+4);
return 0;
}
5์ ๋ง์
์25์
๋๋ค.
3+4์ ๋ง์
์49์
๋๋ค.
์๋ฐ ์์ผ๋ก~~ # ํฐ๋ฐ์ดํ + ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํด์ ์ฌ์ฉํ๋ฉด
๋ฌธ์์ด ์์๋ก ๋ณํํด์ค๋ค
(3) ์กฐ๊ฑด๋ถ ์ปดํ์ผ (Conditional compilation)
์กฐ๊ฑด๋ถ ์ปดํ์ผ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ปดํ์ผํ๋ค๋ผ๋ ๋ป์ธ๋ฐ
์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ์ฒ๋ฆฌํ๊ณ ์ ๋ง์ผ๋ฉด ์ ์ฒ๋ฆฌํ๋ค๋๊ฑฐ๊ฒ ์ฅฌ?
๋ด๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๊ฑด ์ฃผ์์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ค
#if ~ [#elseif] ~ [#else] ~ #endif
์ฃผ์ ์ฒ๋ฆฌํ๊ฑธ ์ข ๋ ๋ช ํํ๊ฒ ๋ณด์ฌ๋๋ฆด๋ผ๊ณ ์บก์ฒ๋ก ๊ฐ์ ธ์๋ดค๋ค
๊ฒฐ๊ณผ๋ 3๋ง ์ถ๋ ฅ๋๋ค
#ifdef~ ์กฐ๊ฑด ์ฌ์ฉ
์ฐ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์ง๋ค๋ณด๋ฉด ์ด์์ฒด์ ์ ๋ฐ๋ผ์,
๋๋ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ์ ๋ฐ๋ผ์ ์ถ๊ฐํด์ผ ํ ํค๋ ํ์ผ๋ ๋ฌ๋ผ์ง๊ณ
๊ทธ๋ด ๋๊ฐ ์๋ค... ๊ทผ๋ฐ ์ด๋๋ง๋ค ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฑด ์ข ๊ทธ๋ ๋ค ๋ง์ด ๊ทธ๋ ๋ค
#ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */
# include <unistd.h>
#elif defined _WIN32 /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems */
# include <windows.h>
#endif
์ด๋ฐ ์์ผ๋ก ํด์ฃผ๋ฉด, ์๋์ด๊ฑด ์ ๋์ค์ด๊ฑด
์์์ ์ปดํ์ผํ ๋ ํฌํจ๋์ด์ผ ํ ํค๋ ํ์ผ์ ํฌํจ์์ผ ์ค๋ค
#if RUBY_VERSION == 190
# error 1.9.0 not supported
#endif
์ด๋ฐ ์์ผ๋ก ํน์ ์กฐ๊ฑด์ด ์๋ ๋ ์๋ฌ๋ฅผ ๋ฑ๋๋ก ํด์ค ์๋ ์๋ค
๊ทธ๋ผ ์ด๋ง
* ์ฐธ๊ณ ๋งํฌ *
http://www.tcpschool.com/c/c_prepro_preprocessor
์ฝ๋ฉ๊ต์ก ํฐ์จํผ์ค์ฟจ
4์ฐจ์ฐ์ ํ๋ช , ์ฝ๋ฉ๊ต์ก, ์ํํธ์จ์ด๊ต์ก, ์ฝ๋ฉ๊ธฐ์ด, SW์ฝ๋ฉ, ๊ธฐ์ด์ฝ๋ฉ๋ถํฐ ์๋ฐ ํ์ด์ฌ ๋ฑ
tcpschool.com
https://ko.wikipedia.org/wiki/C_%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0
C ์ ์ฒ๋ฆฌ๊ธฐ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
๋งคํฌ๋ก๋ ์ปดํผ์ผ๋ฌ์๊ฒ ์ฝ๋์ ํน์ฑ์ ์๋ ค์ฃผ๋ ํค์๋์ด๋ค. ๋ฐ๋ผ์ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผ ๊ณผ์ ์์ ํ์ํ ์์์ด๊ณ , ๋งคํฌ๋ก ์์ฒด๊ฐ ๊ธฐ๊ณ์ด ์ฝ๋๋ก ์์ฑ๋์ง๋ ์์ง๋ง ํน์ ์ฝ๋๋ฅผ ์ ์ดํ๋๋ฐ ์ฌ
ko.wikipedia.org
'๐ C๋ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Boost๋ก ์๊ฐ ๊ฐ ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.11.29 |
---|---|
Boost::program_options ์ฌ์ฉ๊ธฐ (0) | 2022.07.26 |
Error ํด๊ฒฐ: boost::shared_ptr<boost::asio::io_context>::operator* (0) | 2022.02.04 |
STRUCT์ UNION์ ์์๋ณด์ (0) | 2021.07.12 |
C++ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์์๋ณด์ - (2) shared_ptr (0) | 2021.06.25 |