[C언어-막코딩] 매크로(#define) 함수 실험
kr-dev·@codingman·
0.000 HBD [C언어-막코딩] 매크로(#define) 함수 실험
# [C언어-막코딩] 매크로(\#define) 함수 실험 ----- - 다운 사이트 : https://sourceforge.net/projects/orwelldevcpp/ - 웹컴파일러 : https://www.tutorialspoint.com/compile_c_online.php ----- 오늘은 일요일이고 해서 간단히 매크로 함수를 실험하는 내용으로 담아 보았네요. 별다른 내용은 없고 재미로 나만의 코딩을 만들어서 실험하는 것을 목적으로 post를 작성해 봅니다. ## 1. 매크로 복습 ----- 매크로 함수는 지난시간에 변수, 명령어, 함수를 매크로로 만들 수 있다고 했죠. ``` #include <stdio.h> #define MAIN main(int argc, char *argv[]) #define BEGIN { #define END } #define OUTPUT printf MAIN BEGIN OUTPUT("Hello World! \n"); END ``` 이런식으로 말이죠. ``` MAIN BEGIN OUTPUT("Hello World! \n"); END ``` 이 표현을 선행 처리과정에서 원래의 값으로 변환하면은 원래의 값으로 아래와 같이 변경 됩니다. ``` int main(int argc, char *argv[]) { printf("Hello World! \n"); return 0; } ``` 위 내용은 지난시간의 복습 내용이였고요. 이렇게 매크로로 정의하면 기본 C언어 기본 구조에서 프로그램 틀 코딩을 자신의 언어로 만들어 내면 나만의 언어로 코딩을 만들 수 있게 됩니다. 이걸 한글로 바꾼다면, ``` 메인 시작 출력("Hello World! \n"); 종료 ``` 이렇게도 만들 수 있겠죠. 그런데 C언어에서는 지시언어는 한글이 지원하지 않아서 이렇게 한글 매크로는 실험하는데 제약이 따릅니다. 최근 컴파일러나 또는 C#에서는 한글을 지원하기 때문에 할 수 있지만 일반적인 컴파일러에서는 에러가 발생합니다. 암튼 위와 같인 새로운 한글 코딩언어를 만들어 낼 수도 있다는 점만 알아 두시면 됩니다. ## 2. 매크로 함수 ----- 오늘 핵심 실험은 매크로 함수입니다. 기본적으로 사용자 정의 함수를 매크로 만들 수 도 있습니다. **사용자 정의 함수 : 두수의 합을 리턴하는 함수** ``` int sum(int a, int b){ return a+b; } ``` 위와 같은 사용자 정의 함수를 매크로로 표현 하면 다음과 같습니다. ``` #define sum(a,b) a+b ``` 이렇게 한줄로 만들 수 있습니다. **[소스]** ``` #include <stdio.h> #define sum(a,b) a+b int main(int argc, char *argv[]) { printf("%d \n",sum(1,2)); return 0; } ``` **[결과]**  간단한 사용자 정의 함수의 경우는 매크로 더 짧게 코딩 할 수 있습니다. 한줄 짜리 코딩으로 은근히 어떤 특정한 값을 선택하거나 만들 때 많이 사용합니다. 아무 라이브러리 파일들을 열어 보시면 이런 매크로 표현들을 보실 수 있을 거에요. ## 3. 다양한 매크로 표현 ----- 방금한 코딩에 몇가지 상황을 추가하여 실험을 계속 하겠습니다. **추가내용 : gotoxy()함수를 이용해 특정 위치로 sum()값 출력(출력매크로도 추가)** gotoxy()함수는 콘솔창에 커서를 특정위치로 이동시키는 함수입니다. Windows.h 헤더파일에 제공되는 함수를 이용하여 좌표 이동 사용자 함수는 다음과 같습니다. ``` #include <Windows.h> void gotoxy(int x,int y){ COORD pos={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } ``` SetConsoleCursorPosition()함수를 이용하기 위해서는 Windows.h 파일이 선언되어 있어야 합니다. 커서 이동은 전달값 x,y의 위치로 커서가 이동하게 하는 함수입니다. gotoxy(x,y)값을 통해서 좌표를 이동합니다. 이걸 x,y값을 스왑 시켜 좌표를 이동키시는 매크로 함수를 만들어 봅시다. ``` #define gotoxySwap(x,y) gotoxy(y,x) ``` 기존에 기본 gotoxy() 함수 내부를 수정하기 보다는 이시적으로 사용하거나 해당 프로그램에서만 적용 할 내용이면 기본 함수를 수정하지 않더라도 매크로 함수를 통해 원하는 결과를 얻을 수 있습니다. 출력함수가 고정일 때는 아래와 같이 출력 함수 매크로를 표현하여 간단히 구현 할 수도 있습니다. ``` #define Output(x) printf("%d\n",x) ``` 값만 출력하기 때문에 Output(x) 매크로 함수로 해서 printf()문으로 x값이 출력되게 할 수 있습니다. 이제는 위 과정을 순차적으로 결과를 확인하기 위해 하나의 소스를 만들어 봤습니다. **[전체소스]** ``` #include <stdio.h> #include <Windows.h> #define sum(a,b) a+b #define Output(x) printf("%d\n",x) #define gotoxySwap(x,y) gotoxy(y,x) void gotoxy(int x,int y){ COORD pos={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } int main(int argc, char *argv[]) { gotoxy(3,3); printf("%d \n",sum(1,2)); gotoxy(5,5); Output(sum(3,3)); gotoxySwap(7,2); Output(sum(3,6)); return 0; } ``` **[결과]**  3, 6, 9라는 숫자에서 좌표(3,3)로 커서가 이동 한 뒤에 3이라는 숫자가 출력 되고, 좌표 (5,5)로 커서가 이동 한 뒤에 6이 출력 됩니다. 9은 gotoSwap(2,7)라서 좌표(2,7)에서 x,y가 스왑되어 gotoxy(7,2) 되고 좌표(7,2)로 커서가 이동 한 뒤에 9가 출력 됩니다. 그리고 출력함수 매크로도 결과가 잘 나왔네요. ## 마무리 ----- 위 매크로 함수 표현을 잘 참고하시기 바랍니다. 간단한 의미 없는 코딩처럼 보이지만 어떤 느낌의 매크로 표현인지 잘 아시면 매크로 함수를 꽤 유용하게 사용 하실 수 있을 거에요. --- ##### <sub> **Sponsored ( Powered by [dclick](https://www.dclick.io) )** </sub> [](https://api.dclick.io/v1/c?x=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjIjoiY29kaW5nbWFuIiwicyI6ImMtZGVmaW5lLS0xNTU2NDEwMjc3ODM3IiwiYSI6WyJpLTIiXSwidXJsIjoiaHR0cHM6Ly93d3cuZGNsaWNrLmlvIiwiaWF0IjoxNTU2NDEwMjc3LCJleHAiOjE4NzE3NzAyNzd9.InieF8L5xo5qK_BH0rWobwEYPfvoTsqzp4Wgfn_YWZc)