[VEDA] 7์ผ์ฐจ

๋‚˜์šฐํžˆ์ฆˆยท2025๋…„ 3์›” 26์ผ

VEDA

๋ชฉ๋ก ๋ณด๊ธฐ
6/16

19์žฅ. ์ „์ฒ˜๋ฆฌ์™€ ๋ถ„ํ•  ์ปดํŒŒ์ผ

๐Ÿ”น 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

  • ์ตœ์ ํ™” ๋ฐฉ์ง€ ํ‚ค์›Œ๋“œ
  • ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ I/O ์ฃผ์†Œ ๋“ฑ์€ ํ•˜๋“œ์›จ์–ด ์ƒํƒœ๊ฐ€ ์–ธ์ œ๋“  ๋ฐ”๋€Œ๋ฏ€๋กœ 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 ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌํ•œ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ๋งˆ๋‹ค ๋™์ž‘์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
#pragma pack(1)  // 1๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ •๋ ฌ (ํŒจํ‚น)
struct A {
  char a;
  int b;
};
#pragma pack()

โœ… 1. static โ€“ ์ •์  ์ €์žฅ ํด๋ž˜์Šค

๐Ÿ”น ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•  ๋•Œ (file scope static)

// a.c
static int count = 0;
  • ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” a.c ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์œ ํšจ (ํŒŒ์ผ ์ง€์—ญ ๋ณ€์ˆ˜)
  • ๋‹ค๋ฅธ ์†Œ์Šค ํŒŒ์ผ์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
  • ๋ง์ปค์— ์‹ฌ๋ณผ์ด ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ โ†’ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€

๐Ÿ”ง ์‚ฌ์šฉ ๋ชฉ์ :

  • ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์“ฐ์ด๋Š” ์ „์—ญ ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋Š” static์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์€๋‹‰
  • ์บก์Аํ™”, ์‹ฌ๋ณผ ์ถฉ๋Œ ๋ฐฉ์ง€

๐Ÿ”น ํ•จ์ˆ˜์— ์‚ฌ์šฉํ•  ๋•Œ

static void helper() {
    // ...
}
  • ์ด ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์†Œ์ŠคํŒŒ์ผ ์•ˆ์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ๋‹ค๋ฅธ .c ํŒŒ์ผ์—์„œ๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€

โœ… 2. extern โ€“ ์™ธ๋ถ€ ๋ณ€์ˆ˜/ํ•จ์ˆ˜ ์„ ์–ธ

// b.h
extern int count;

// b.c
int count = 100;
  • extern์€ ์ •์˜๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์žˆ๋‹ค๋Š” ๋œป์ด๊ณ , ๋ง์ปค์—๊ฒŒ ํ•ด๋‹น ์‹ฌ๋ณผ์„ ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์˜ค๋ผ๊ณ  ์•Œ๋ฆผ
  • ์ „์—ญ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ์†Œ์ŠคํŒŒ์ผ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

๐Ÿ”ง ์‚ฌ์šฉ ๋ชฉ์ :

  • ํ—ค๋” ํŒŒ์ผ์— extern ์„ ์–ธํ•˜์—ฌ, ์—ฌ๋Ÿฌ .c ํŒŒ์ผ์—์„œ ๋™์ผ ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋ฅผ ๊ณต์œ 

โœ… ์˜ˆ์‹œ๋กœ ์ •๋ฆฌ

๐Ÿ”ธ 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 ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์ •์˜๋œ ๊ฒƒ ์‚ฌ์šฉ โœ… ์™ธ๋ถ€ ์ ‘๊ทผ ๊ฐ€๋Šฅ

โœ… ์ž„๋ฒ ๋””๋“œ ๊ด€์  ํŒ

  • ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— extern์„ ์ ๊ทน ์‚ฌ์šฉ
  • ๋ฐ˜๋ฉด, ๋“œ๋ผ์ด๋ฒ„ ๋‚ด๋ถ€์˜ ๋กœ์ปฌ ์ƒํƒœ(๋ฒ„ํผ, ํ—ฌํผ ํ•จ์ˆ˜ ๋“ฑ)๋Š” static์œผ๋กœ ์ˆจ๊ฒจ์•ผ ํ•จ
  • ์ž˜๋ชป๋œ extern ์‚ฌ์šฉ์€ ๋ง์ปค ์—๋Ÿฌ(undefined reference)๋กœ ์ด์–ด์ง โ†’ ์„ ์–ธ๊ณผ ์ •์˜ ๊ตฌ๋ถ„ ๋ช…ํ™•ํžˆ

0๊ฐœ์˜ ๋Œ“๊ธ€