**함수가 사용하는 메모리 : 스택(Stack)**
함수와 관련된 내용(Stack frame)
1. 얼마나 메모리를 사용할 것 인지 → 임시 데이터
2. 매개변수 (인자)
3. 반환 주소
- bp : 함수가 사용하는 메모리의 시작 주소
- sp : 함수가 사용할 수 있는 메모리의 끝 주소

**호출자(Caller) :**
void main()
{
	int a = 3, b = 5, c = 0;
	c = **Sum(a,b)
}**
=> main이 Sum을 호출 하고 있어서 호출자

피호출자(Callee) :
int Sum(int parm_a, int parm_b)
{
	return parm_a + parm_b
}
=> 호출 되기 때문에 피 호출자

호출 규약(Calling Covention)
→ 인자를 어떻게 전달할 것이며, 반환 값을 어떻게 돌려줄 건인가
+ Calling Convention : 인사 전달, 반환값 받는 것, 스택 포인터 정지에 대한 규칙
x86

__cdecl : 기본 호출 규약. 인자는 오른쪽부터 왼쪽 순서대로 스택에 넣고, 
스택 정리는 호출자가 한다. 가변 인자 사용 가능
우너래 함수를 "_함수명" 으로 변환한다.
실행 파일 크기는 "크다."
>> add esp, 8
-> sp 레지스터에 스택프레임이 반환될 지점을 기록해두는 일을 한다.

__stdcall : 인자를 오른쪽부터 왼쪽 순서대로 스택에 넣고, 
스택 정리는 피호출자가 한다. 가변 인자 사용 불가능
원래 함수를 "_함수명+@+인자목록의 바이트 수"로 변환한다.
실행 파일 크기는 "작다."

__fastcall : (가능하다면) 첫 번째 인자와 두 번째 인자를 레지스터에 저장하고, 
나머지 인자는 오른쪽에서 왼쪽 순서대로 스택에 넣음. 스택 정리는 피 호출자가 한다.

x64
4번째 인자까지 레지스터에 넣고, 스택 정리는 피호출자가 한다.

#빌드 : 프로그램을 만드는 과정
1. 전처리 : 컴파일 전에 하는 처리이다.
                → 조건부 컴파일 / 매크로 대체 / 다른 파일 포함 등
2. 컴파일 : 사람의 언어로 작성된 소스 코드를 컴퓨터가 알 수 있는 언어로 번역
3. 링크 : 식별자가 의미하는 메모리 주소를 연결

--
헤더파일

#pragma once

typedef struct A
{
	int a;
	int b;
}A;

int A(int a, int b);
--
소스파일

/#include "MyHeaderFile.h"
int Add(int a, int b)
{
	return a + b;
}
int main(void)
{
	int c = Add(10, 20);
}
#include <stdio.h>

#define SPEED_OF_LIGHT 299792468
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define PRINT(msg) puts(#msg)//#붙여야 댐
#define DECLARE_MYTYPE(typename) struct MyType##typename
#define SIMPLE_PRINT(...) puts(#__VA_ARGS__)
#define FORMAT_PRINT(fmt, ...) printf(fmt, __VA_ARGS__)

#undef ?

int main(void)
{
	printf("빛의 속도는 %d m/s이다.\\n", SPEED_OF_LIGHT);

	if (MIN(10 - 20, 20 < 4))
	{
		printf("10과 20중에 작은 수는 10입니다.\\n");
	}

	PRINT(정말 잠이 온다 정말...);

	DECLARE_MYTYPE(Student)
	{
		int a;
	}a;

	SIMPLE_PRINT(2, 'a', "Godness");

	FORMAT_PRINT("테스트 : %d, %c, %s", 10, 'A', "Sleep");

	return 0;

}

#include <stdio.h>

#define PRINT_ERROR(msg) printf("[%s:%d] %s\\n", __FILE__,__LINE__,msg)

int main(void)
{
	if (1)
	{
		PRINT_ERROR("오류발생.");
	}

	return 0;

	/*printf("FILE : %s\\n", __FILE__);
	printf("LINE : %d\\n", __LINE__);
	printf("DATE : %s\\n", __DATE__);
	printf("TIME : %s\\n", __TIME__);
	
	return 0;*/
}

#include <stdio.h>

int main(void)
{
#if (1)
	puts("1. 이건 실행된다");

#endif

#if defined(TEST)
	puts("2. 이건 실행 안된다.");
#else
	puts("2. 이건 실행된");
#endif

#if !defined(TEST)
	puts("3. 이건 실행된");
#else 
	puts("3 .이건 실행불가")
#endif

#define TEST
#ifdef TEST
		puts("4. 이건 실행그");
#else
	puts("4. 실행이 안되요");
#endif

#define T 10
#ifndef TEST
	puts("5. 이건 실행 안돼");
#elif defined(T) & T>2
	puts("S. 이건 실행 되는데");
#else
	puts(5. 이건 실행 안된다니까);
#endif
}

struct A
{
	int a;
	double d;
	char ch;
};

int main(void)
{
	sizeof(struct A);

}

빌드 : 프로그램을 만드는 과정
1. 전처리 : 컴파일 전에 하는 처리
 > - 조건부 컴파일 / 매크로 대체 / 다른 파일 포함 등
2. 컴파일 : 소스코드 -> 기계어 / 사람의 언어로 작성된 소스 코드를 컴퓨터가 알 수 있는 언어로 번역
3. 링크 : 식별자가 의미하는 메모리 주소를 연결

#include <stdio.h>

int main(void)
{
	for (int i = 0; i < 10; i++)
	{
		puts("안녕하세요");
	}
	return 0;
}

Untitled

밑의 사이트가 정말 자세하고 알기 쉽게 정리해 놨다. 헷갈릴 때마다 보자

팁스소프트 > MFC/API 가이드 > [교육자료] __stdcall 과 __cdecl 에 대하여...