이미 정의된 매크로
매크로에는 이미 그 정의가 약속되어 있어 사용자가 취소하거나 바꿀 수 없는 매크로명이 있다
#include <stdio.h>
void func(void);
int main(void)
{
printf("컴파일 날짜와 시간 : %s, %s\n\n", __DATE__, __TIME__); // 컴파일을 시작한 날짜와 시간으로 치환
printf("파일명 : %s\n", __FILE__); // 전체 디렉터리 경로를 포함한 파일명으로 치환
printf("함수명 : %s\n", __FUNCTION__); // 매크로명이 사용된 함수 이름으로 치환
printf("행번호 : %d\n", __LINE__); // 매크로명이 사용된 행 번호로 치환(10행에서 사용했으므로 정수 10이 됨)
#line 100 "marco.c" // __LINE__ // 행 번호를 100부터 시작, 파일명은 macro.c로 표시
func(); // 여기부터 행 번호는 100으로 시작
return 0;
}
void func(void)
{
printf("\n");
printf("파일명 : %s\n", __FILE__);
printf("함수명 : %s\n", __FUNCTION__);
printf("행번호 : %d\n", __LINE__); // 13행부터 100을 시작으로 행 번호가 1씩 증가하므로 110이 나온다
}
매크로 연산자 #과 ##
매크로 함수를 만들 때 매크로 연산자를 사용하면 인수를 특별한 방법으로 치환할 수 있다
- #은 매크로 함수의 인수를 문자열로 치환한다
- ##은 두 인수를 붙여서 치환한다
#include <stdio.h>
#define PRINT_EXPR(x) printf(#x " = %d\n", x)
#define NAME_CAT(x, y) (x ## y)
int main(void)
{
int a1, a2;
NAME_CAT(a, 1) = 10; // a1 = 10
NAME_CAT(a, 2) = 20; // a2 = 20
PRINT_EXPR(a1 + a2); // printf("a1 + a2" " = %d\n", a1 + a2);
PRINT_EXPR(a2 - a1); // printf("a2 - a1" " = %d\n", a2 - a1);
return 0;
}
#연산자
= 인수를 문자열로 치환
## 연산자
= 2개의 토근을 붙여서 하나로 만드는 연산자
조건부 컴파일 지시자
조건부 컴파일은 소스 코드를 조건에 따라 선택적으로 컴파일한다
#include <stdio.h>
#define VER 7 // 매크로명 정의
#define BIT16 // 매크로명 정의
int main(void)
{
int max;
#if VER >= 6 // 매크로명 VER이 정의되어 있으면
printf("버전 %d입니다.\n", VER); // 이 문장 컴파일
#endif
#ifdef BIT16 // 매크로명 B1T16이 정의되어 있으면
max = 32767; // 이 문장 컴파일
#else
max = 2147483647;
#endif
printf("int형 변수의 최댓값 : %d\n", max);
return 0;
}
#if, #else, #elif 지시자 형식
#undef 지시자
= 매크로명의 정의를 취소
#ifdef 지시자
= #if defined
#ifndef 지시자
= #if !defined
#error 지시자
= 조건 불만족 시에는 #error 지시자로 컴파일을 중단할 수 있다
#pragma 지시자
컴파일러의 컴파일 방법을 세부적으로 제어할 때 사용한다
#include <stdio.h>
#pragma pack(push, 1)
typedef struct
{
char ch;
int in;
} Sample1;
#pragma pack(pop)
typedef struct
{
char ch;
int in;
} Sample2;
int main(void)
{
printf("Sample1 구조체의 크기 : %d바이트\n", sizeof(Sample1));
printf("Sample2 구조체의 크기 : %d바이트\n", sizeof(Sample2));
return 0;
}
#pragma pack
= 구조체의 바이트 얼라인먼트 단위 크기를 결정
#pragma warning
= 경고 메세지를 관리
#pragma warning(disable:4101) // 4101번 경고 메세지는 모두 표시하지 않는다
#pragma pack (push)
= 바이트 얼라인먼트를 바꿀 때 현재의 규칙을 기억
#pragma pack (pop)
= 바꾸기 전의 바이트 얼라인먼트 규칙을 적용하려면 이전의 규칙을 복원
'C 언어 > [책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글
배열과 포인터의 관계 (2) (0) | 2023.01.26 |
---|---|
배열과 포인터의 관계 (1) (0) | 2023.01.26 |
전처리 지시자 (1) (0) | 2023.01.10 |
포인터 완전 정복을 위한 포인터 이해하기 (2) (0) | 2022.12.21 |
포인터 완전 정복을 위한 포인터 이해하기 (1) (0) | 2022.12.21 |