C 마クロ: 초보자 가이드

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 C 언어의 마법적인 세계, 마cro의 세계로 접수합니다. 코드를 한 줄도 작성해 본 적이 없으신 분들도 걱정 마세요 - 이 여정에서 여러분의 친절한 안내자가 되겠습니다. 이 튜토리얼이 끝나면 여러분이 얼마나 많이 배웠는지 놀라실 겁니다!

C - Macros

마cro는 무엇인가요?

먼저, 마cro에 대해 이해해 보겠습니다. 마cro는 코드의 단축키나 템플릿을 생각해 보세요. 여러분의 코딩 생활을 더 쉽게 만들고 프로그램을 더 효율적으로 만들어주는 작은 도우미들입니다.

객체似的 마cro

가장 간단한 형태의 마cro에서 시작해 보겠습니다: 객체似的 마cro.

정의와 문법

객체似的 마cro는 #define 지시어를 사용하여 정의됩니다. 기본 문법은 다음과 같습니다:

#define MACRO_NAME value

예제

다음 예제를 보겠습니다:

#define PI 3.14159
#define MAX_STUDENTS 100
#define SCHOOL_NAME "Coder's Academy"

이 예제에서, 컴파일러가 PI를 볼 때마다 3.14159로 치환합니다. 마찬가지로 MAX_STUDENTS100, SCHOOL_NAME은 "Coder's Academy"로 치환됩니다.

코드에서의 사용

이제 이 마cro를 코드에서 어떻게 사용할 수 있는지 보겠습니다:

#include <stdio.h>

#define PI 3.14159
#define MAX_STUDENTS 100

int main() {
float radius = 5.0;
float area = PI * radius * radius;

printf("원의 면적은: %.2f\n", area);
printf("우리 학교는 %d 명의 학생을 수용할 수 있습니다.\n", MAX_STUDENTS);

return 0;
}

이 프로그램을 실행하면 다음과 같은 출력이 나옵니다:

원의 면적은: 78.54
우리 학교는 100 명의 학생을 수용할 수 있습니다.

이렇게 마cro를 일반 변수처럼 사용할 수 있지만, 실제로는 프로그램이 컴파일되기 전에 그들의 값을 치환합니다. 멋지지 않나요?

함수似的 마cro

이제 한 단계 더 나아가 함수似的 마cro를 살펴보겠습니다. 이들은 함수처럼 보이지만 약간 다르게 작동합니다.

정의와 문법

함수似的 마cro의 문법은 다음과 같습니다:

#define MACRO_NAME(parameters) (macro_body)

예제

다음 두 가지 예제를 보겠습니다:

#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

코드에서의 사용

이제 이 마cro를 프로그램에서 사용해 보겠습니다:

#include <stdio.h>

#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
int num1 = 5, num2 = 7;

printf("%d의 제곱은 %d\n", num1, SQUARE(num1));
printf("%d와 %d의 최대값은 %d\n", num1, num2, MAX(num1, num2));

return 0;
}

이 프로그램은 다음과 같은 출력을 보여줍니다:

5의 제곱은 25
5와 7의 최대값은 7

SQUARE(5)((5) * (5))로, MAX(5, 7)((5) > (7) ? (5) : (7))로 치환되어 프로그램이 컴파일되기 전에 치환됩니다.

연속된 마cro

연속된 마cro는 하나의 마cro가 다른 마cro를 정의에 사용하는 것입니다. 마cro의 마cro 인셔션입니다!

예제

#define SQUARE(x) ((x) * (x))
#define CUBE(x) (SQUARE(x) * (x))

여기서 CUBESQUARE를 정의에 사용하고 있습니다. CUBE(3)를 사용할 때, 먼저 (SQUARE(3) * (3))로 확장되고, 그后再 (3 * 3) * (3)로 확장됩니다.

가변 인수 마cro

가변 인수 마cro는 변하는 인수 개수를 받을 수 있는 마cro로, 마치 스위스 아ーノ이Knife 같습니다!

문법

#define MACRO_NAME(args...) macro_body

예제

#include <stdio.h>

#define DEBUG_PRINT(format, ...) printf("Debug: " format "\n", ##__VA_ARGS__)

int main() {
int x = 5;
float y = 3.14;

DEBUG_PRINT("x = %d", x);
DEBUG_PRINT("x = %d, y = %.2f", x, y);

return 0;
}

이 프로그램은 다음과 같은 출력을 보여줍니다:

Debug: x = 5
Debug: x = 5, y = 3.14

마cro 정의의 ...는 인수의 수를 받아들이고, __VA_ARGS__는 마cro 본문에서 이 인수들을 치환합니다.

사전 정의된 마cro

C는 몇 가지 유용한 내장 마cro를 제공합니다. 다음은 그 중 몇 가지입니다:

마cro 설명
__FILE__ 현재 파일명
__LINE__ 현재 줄 번호
__DATE__ 컴파일 날짜
__TIME__ 컴파일 시간
__STDC__ 컴파일러가 ANSI C를 준수하면 1

예제

#include <stdio.h>

int main() {
printf("이 파일의 이름은 %s\n", __FILE__);
printf("이는 줄 %d\n", __LINE__);
printf("compilation 날짜 %s at %s\n", __DATE__, __TIME__);
return 0;
}

이 프로그램은 다음과 같은 출력을 보여줍니다:

이 파일의 이름은 example.c
이는 줄 5
compilation 날짜 Jul 10 2023 at 15:30:45

이제 여러분은 C 마cro의 세계에 첫 걸음을 내딛었습니다. 마cro는 강력한 도구이지만, 지혜롭게 사용해야 합니다. 코드를 더 효율적이고 읽기 쉽게 만들 수 있지만, 과도한 사용은 혼란을 줄 수 있습니다. 연습하고 실험하고, 곧 마cro를 마스터하시길 바랍니다!

Credits: Image by storyset