๐Ÿ“– C๋ž‘ C++

์ „์ฒ˜๋ฆฌ๊ธฐ(preprocessor)์™€ ๋งคํฌ๋กœ(macro)

bell22 2022. 2. 7. 16:14

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