๐น 1. ์ปดํ์ผ ์ ๊ณผ์ : ์ ์ฒ๋ฆฌ
โข C ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ ์ ์ ์ ์ฒ๋ฆฌ(preprocessing)๋ฅผ ๊ฑฐ์นจ.
โข #include, #define, #ifndef~#endif, #pragma once ๋ฑ์ ์ ์ฒ๋ฆฌ ์ง์์ด์ด๋ฉฐ, ์ปดํ์ผ ์ ์ ์ฒ๋ฆฌ๋จ.
๐น 2. ์ปดํ์ผ ํ๋ฆ ์์ฝ
1. ์ ์ฒ๋ฆฌ โ #include ๋ฑ ์ฒ๋ฆฌ
2. ์ปดํ์ผ โ ์์ค ์ฝ๋ โ ์ค๋ธ์ ํธ ํ์ผ (.o)
3. ๋งํฌ(link) โ ์ค๋ธ์ ํธ ํ์ผ + ๋ผ์ด๋ธ๋ฌ๋ฆฌ โ ์คํํ์ผ (.elf, .exe ๋ฑ)
๐ก Startup code: main()์ด ์คํ๋๊ธฐ ์ ์ ํ์ํ ์ด๊ธฐํ ์ฝ๋๋ก, ๋ง์ปค๊ฐ ์๋ ์ฐ๊ฒฐ
๐น 3. ํค๋ํ์ผ (#include) ์ฌ์ฉ ์ด์
โข ํจ์ ์ํ, ์๋ฃํ, ๊ตฌ์กฐ์ฒด, ๋งคํฌ๋ก ๋ฑ์ ์ ์ธํด๋ ํ์ผ.
โข ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ํด ํค๋ ํ์ผ์ ์ ์ธํ๊ณ , ํ์ํ .c ํ์ผ์์ #include๋ก ๊ฐ์ ธ๋ค ์.
๐ ์ฌ์ฉ ๊ตฌ๋ถ
โข <stdio.h>: ์์คํ
์ ๊ณต ํค๋ (์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๋ก ์๊ณ ์์)
โข "mem.h": ์ฌ์ฉ์ ์ ์ ํค๋ (์ปดํ์ผ ์ -I ์ต์
๋ฑ์ผ๋ก ๊ฒฝ๋ก ์ง์ )
๐น 4. ๋ถํ ์ปดํ์ผ
โข ๊ธฐ๋ฅ๋ณ๋ก .c ํ์ผ๊ณผ .h ํ์ผ์ ๋๋
โข .h : ์ ์ธ (ํจ์ ์ํ, ๊ตฌ์กฐ์ฒด ๋ฑ)
โข .c : ์ ์ (ํจ์ ์ค์ ๊ตฌํ)
๐ ์ ์ง๋ณด์์ฑ โ, ์ฌ์ฌ์ฉ์ฑ โ
๐น 5. ๊ตฌ์กฐ์ฒด ์ ์ธ ์์น
โข ์ฌ๋ฌ ํ์ผ์์ ๊ณต์ ํ ๊ตฌ์กฐ์ฒด๋ ํค๋ ํ์ผ์ ์ ์ธ
โข ๋ณ๊ฒฝ ์ ํค๋๋ง ์์ ํ๋ฉด ์ ์ฒด์ ๋ฐ์๋์ด ํธ๋ฆฌ
๐น 6. ์๋ฒ ๋๋ ๊ด์ ํ
โข ์๋ฒ ๋๋์์ ์ ์ฒด ๋น๋ ๋์ ์ค๋ธ์ ํธ ํ์ผ๊น์ง๋ง ์์ฑํ๊ฑฐ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง๋ค๊ธฐ๋ ํจ
โข ์ปดํ์ผ, ๋งํฌ ๊ณผ์ ์ IDE๊ฐ ์จ๊ฒจ์ฃผ์ง๋ง ๊ฐ๋ฐ์๋ ๋ด๋ถ ๋น๋ ๊ณผ์ ์ ๋ฐ๋์ ์ดํดํด์ผ ํจ
โข ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ ์ค๋ธ์ ํธ ํํ๋ก ์ปค๋์ ํ์ฌ๋จ
๐น 1. #define ๋งคํฌ๋ก
#define MAX 20
char name[MAX];
๐น 2. ๋งคํฌ๋ก ํจ์
#define bitSet(data, pos) ((data) | (1 << (pos)))
#define bitClear(data, pos) ((data) & (~(1 << (pos))))
๐น 3. volatile
volatile int* ptr = (int*)0x40000000;
*ptr = 10;
*ptr = 20;
๐น 4. ๋ฏธ๋ฆฌ ์ ์๋ ๋งคํฌ๋ก
__FILE__ ํ์ผ ์ด๋ฆ
__FUNCTION__ ํจ์ ์ด๋ฆ
__LINE__ ํ์ฌ ๋ผ์ธ ๋ฒํธ
__DATE__, __TIME__ ์ปดํ์ผ๋ ๋ ์ง/์๊ฐ
printf("ํ์ผ๋ช
: %s\n", __FILE__);
๐น 5. ์กฐ๊ฑด๋ถ ์ปดํ์ผ
#define VER 6
#define BIT32
#if VER >= 6
printf("๋ฒ์ %d์
๋๋ค.\n", VER);
#endif
#ifdef BIT16
max = 32767;
#elif !BIT16
max = 2147483647;
#endif
#if, #ifdef, #ifndef, #elif, #else, #endif ๋ฑ ์ฌ์ฉ๐น 6. #, ## ์ ์ฒ๋ฆฌ ์ฐ์ฐ์
# : ๋งคํฌ๋ก ์ธ์๋ฅผ ๋ฌธ์์ดํ## : ํ ํฐ์ ์ฐ๊ฒฐํด๋น ์ ์ฒ๋ฆฌ ์ฐ์ฐ์๋ฅผ ํตํด, ์ ์ฒ๋ฆฌ ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉ๋จ
๐น 7. #pragma
#pragma pack(1) // 1๋ฐ์ดํธ ๋จ์ ์ ๋ ฌ (ํจํน)
struct A {
char a;
int b;
};
#pragma pack()
๐น ๋ณ์์ ์ฌ์ฉํ ๋ (file scope static)
// a.c
static int count = 0;
๐ง ์ฌ์ฉ ๋ชฉ์ :
๐น ํจ์์ ์ฌ์ฉํ ๋
static void helper() {
// ...
}
// b.h
extern int count;
// b.c
int count = 100;
๐ง ์ฌ์ฉ ๋ชฉ์ :
โ ์์๋ก ์ ๋ฆฌ
๐ธ counter.h
// ์ ์ธ๋ง
extern int counter;
void increment(void);
๐ธ counter.c
#include "counter.h"
int counter = 0;
void increment() {
counter++;
}
๐ธ main.c
#include "counter.h"
int main() {
increment();
printf("counter = %d\n", counter);
}
๐ก ์ฌ๊ธฐ์ counter๊ฐ static์ด์๋ค๋ฉด main.c์์๋ ์ฌ์ฉํ ์ ์์์.
๐ก ๋ง์ฝ increment()๋ฅผ static์ผ๋ก ํ์ผ๋ฉด, main.c์์ ๋งํฌ ์ค๋ฅ ๋ฐ์.
โ ์ ๋ฆฌ ํ
ํค์๋ ์ ์ฉ ๋์ ์๋ฏธ ํ์ผ ๊ฐ ์ ๊ทผ
static ๋ณ์, ํจ์ ํ์ผ ๋ด์์๋ง ์ฌ์ฉ โ ์ธ๋ถ ์ ๊ทผ ๋ถ๊ฐ
extern ๋ณ์, ํจ์ ์ธ๋ถ์ ์ ์๋ ๊ฒ ์ฌ์ฉ โ
์ธ๋ถ ์ ๊ทผ ๊ฐ๋ฅ
โ ์๋ฒ ๋๋ ๊ด์ ํ