본문 바로가기

전체 글

(68)
#undef #undef는 정의된 매크로 상수를 삭제하는 매크로입니다. #undef (매크로 상수 이름) #undef를 사용하면 이미 정의된 매크로 상수 값을 바꿀 수 있습니다. #define ABC 1 #undef ABC #define ABC 2 ​
조건 매크로 #if는 일반 if 문처럼 값(조건)이 참일때 해당 블록을 실행합니다. #elif(elseif), #else도 마찬가지입니다. 다만, 일반 if 문처럼 {}로 시작과 끝을 구분하지 않고 끝부분에 #endif를 추가합니다. 또, 조건문에 ()를 쓰지 않아도 됩니다. #define LEVEL 1 #if LEVEL==1//#if (LEVEL==1)와 같은 뜻입니다. //코드1 실행 #elif LEVEL==2 //코드2 실행 #else //코드3 실행 #endif #if는 매크로라서 컴파일 시간에 실행됩니다. 그래서 LEVEL이 1인 경우 컴파일 되면 코드1만 실행되고 코드2, 3은 일반 if 문과 다르게 아예 없는 코드가 됩니다. 그리고 #if는 매크로 값을 평가하기 때문에 매크로만 넣어 비교해야 합니다. 만..
#, ##, \ #include #define PRINT(str) printf("출력:"#str) int main() { PRINT(안녕); return 0; } #은 매크로 함수에서 인수 앞에 쓸 수 있으며, 인수의 값을 문자열로 바꾸는 기능을 합니다. 여기서 str이 안녕으로 변해 "출력:"#안녕이 되고 이게 문자열로 변환돼서 "출력:""안녕" 즉, "출력:안녕"이 됩니다. ​ ##은 양옆 값 사이에 위치하며 두 값을 합치는 기능을 합니다. #include #define PRINT2(a,b) printf(a##b) int main() { PRINT2("안녕", "잘가"); return 0; } a, b가 안녕,잘가로 바뀌고 두 개가 합쳐져 안녕잘가가 됩니다. 여기서 ##가 빠지면 a, b가 아니라 ab 단일 문자가 ..
#define #define은 매크로 상수를 정의하는 전처리기입니다. #define (이름) (값) 형식으로 씁니다.(값은 생략 가능) #include #define BASE 12 int main() { float a = 1 / BASE;//1 / 12 float b = BASE * 3;//36 return 0; } 위와 같이 일반 변수처럼 쓸 수 있습니다. 그러나 일반 변수와 다르게 BASE에 12가 치환되는 것입니다. 즉, float a = 1 / BASE 코드는 float a = 1 / 12코드로 변합니다. 그렇기 때문에 BASE = 2; 같이 값을 변경하려 하면, 코드가 12 = 2;와 같기 때문에 오류가 납니다. 그리고 값에 단순한 단일 숫자가 아니라 식, 문자열 등 원하는 문자를 모두 쓸 수 있습니다. 단순..
#include #include는 어떤 파일의 내용을 포함시키는 전처리기입니다. 단순히 불러오는 것이 아닙니다. 파일 : 1.h void Func(); 그리고 1의 코드를 쓰면 다음 2의 코드랑 동작은 완전히 같게 됩니다. 1. #include #include "1.h" int main() { return 0; } 2. #include void Func(); int main() { return 0; } 위와 같이 #include 부분을 해당 파일 내용으로 대체시킵니다. 그리고 #include 파일명 양옆에 들어가는 ""와 의 차이는 는 컴파일러에서 설정한 경로들을 검색해서 파일을 찾지만 ""는 거기에 더해서 해당 파일과 같은 경로를 찾습니다. 즉, 1에서 1.h 파일은 해당 소스 파일이랑 같은 경로에 (또는 컴파일러가 ..
함수 호출 규약 함수 호출 규약은 대표적으로 __stdcall, __cdecl이 있고 함수 리턴 타입과 이름 사이에 씁니다. void __stdcall Func() {} 쓰지 않았을 때의 기본값은 __cdecl입니다. 함수를 동작하는 데는 내부적으로 스택을 정리하는 동작이 필요한데 이 동작을 __cdecl의 경우 함수를 호출하는 곳 바로 밑에 추가하고, __stdcall의 경우 함수 내부에서 추가됩니다. void __cdecl Func1() { } Func1(); //스택 정리 Func1(); //스택 정리 Func1(); //스택 정리 void __stdcall Func2() { //스택 정리 } Func2(); Func2(); Func2(); Func1의 경우 3개의 코드가 추가되고, Func2의 경우 1개의 코드가..
배열 포인터 함수 인수 함수 인수를 int ar[] 형식으로 지정하면 배열만 전달 가능한 것이 아니라 포인터를 전달 가능하다는 뜻입니다. 즉, int* ar과 뜻이 같습니다. void Func(int ar[]) { } 그리고 [] 안에 숫자를 무엇을 쓰든 상관없이 무조건 똑같은 포인터로 전달되기 때문에 실제로 프로그램에 영향을 끼치지 않습니다. void Func(int ar[3]) {//int ar[]과 int* ar과 같습니다. } 그렇지만 암묵적으로 함수에 배열을 전달해야 된다는 것을 표시하기 위해서 이런 표기법을 사용하는 것입니다. 그리고 함수 인수에 배열 포인터를 전달할 수 있는데 마찬가지로 int ar[][3]은 int (*ar)[3] 또는 int ar[(숫자)][3]과 같습니다. int Func2(int ar[][3..
포인터 배열과 배열 포인터 포인터 배열은 포인터가 여러 개 있는 배열이고 배열 포인터는 배열 자체의 위치를 나타내는 포인터입니다. int* ar[3];//int 포인터가 3개 있는 배열(포인터 배열) int (*ar2)[3];//int 배열의 포인터(배열 포인터)(괄호를 꼭 써주세요.) int의 포인터는 int 배열을 담을 수 있었습니다. 그러니까 int 배열의 포인터는 int 이중 배열을 담을 수 있습니다. int ar3[2][3] = {{1,2,3},{4,5,6}}; ar2 = ar3;//*ar2는 ar3[0]과 같습니다. int 포인터에 배열을 넣으면 포인터는 배열의 첫 부분을 참조하는 것처럼 int par[3] = {1,2,3}; int* pt = par;//*pt는 par[0]과 같습니다. 그리고 pt는 par의 크기를 ..