묻공러
[C] 전처리기 지시자와 컴파일 플래그
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (487)
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 (124)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
      • 유니티 (1)
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
C/[코드조선] C 핵심

[C] 전처리기 지시자와 컴파일 플래그

2024. 2. 17. 15:18

전처리기(Preprocessor)
프로그래머가 작성한. c 파일을 전처리기는 아래와 같은 전처리 작업을 수행한다

1. 주석 삭제
2. 매크로 처리 (매크로된 것을 모두 복사 붙여 넣기)
3. include 되어 있는 .h 헤더파일 처리 (헤더파일 모두 복사 붙여 넣기)
위와 같은 작업을 통해 만들어진 파일이 Translation unit 파일이다

전처리기 지시자 (#)
전처리기 지시자가 붙은 문을 전처리기 지시문이라고 부른다
ex) #include, #define, #ifndef, #endif, …

전처리기 지시문의 활용
1. 매크로 문법을 통해 텍스트 대체
#define 구문이 대표적이다

소스코드 상의 특정 텍스트를 대체한다

이외에도 #undef 구문 혹은 전처리기 연산자 #, ##을 활용.

 

2. 다른 소스파일을 인클루드

 #include 구문으로 가능하다


3. 소스 파일의 일부를 조건부로 컴파일
  #if, #ifdef, #ifndef, #else, #elif, #endif 구문으로 가능하다


4. 에러 강제 발생
  #error 구문으로 가능하다
  

전처리기 지시문 종류
- #define {식별자} {값}
전처리기가 {식별자}를 보면 모두 {값}으로 대체한다
ex) #define TEN (10)
  
- #define {식별자}
{값}을 적지 않으면 전처리기 지시어 정의 구문이다
조건부 컴파일에서 {식별자} 정의 유무에 따라 분기한다

ex. #if, #ifdef, #ifndef, #else, #elif, #endif,...
  
- #undef {식별자}
기존에 정의되어 있던 {식별자}를 삭제한다
정의되어 있는 {식별자}가 없다면 무시한다

 

C 표준에 정의되어 있는 #define 구문들
__FILE__: 현재 파일명을 문자열로 표시 (오류 출력 시 주로 사용)
__LINE__: 현재 소스코드의 줄 번호를 정수형으로 표시  (오류 출력시 주로 사용)

__STDC_VERSION__: 현재 컴파일에 사용 중인 C 표준(C95 표준부터 지원)
이뿐만 아니라 각 컴파일러마다 추가로 정의된 기타 매크로들도 존재한다

fprintf(stderr, “Internal error: %s, line %d.\n”, __FILE__, __LINE__);

 



컴파일 플래그를 통한 매크로 정의

컴파일 플래그를 통해 매크로 정의가 가능하다
"-D" 컴파일 플래그로 매크로 정의가 가능하며 Define의 약자이다

clang -std=c99 -W -Wall -pedantic-errors -DA *.c


위와 같이 컴파일 플래그를 작성하면,

#define A (1)과 동일한 효과를 가진다
주의할 점은 #define A가 아니라는 점이다

 

혹은 아래와 같이 대체할 값을 지정할 수도 있다

clang -std=c99 -W -Wall -pedantic-errors -DA=7 *.c

 

#define A (7)과 동일한 효과를 가진다

컴파일 플래그를 통한 배포용 컴파일
"-DNDEBUG" 컴파일 플래그를 작성하면 배포(Release) 모드로 실행파일을 컴파일할 수 있다
Not Debug의 약자이고 assert() 함수 호출 코드가 사라진다

clang -std=c99 -W -Wall -pedantic-errors -DNDEBUG *.c


배포용으로 컴파일을 한다면,

디버그 모드에서만 실행되어야 하는 코드들은

#if !defined (NDEBUG)로 따로 처리해줘야 한다

저작자표시 비영리 변경금지 (새창열림)

'C > [코드조선] C 핵심' 카테고리의 다른 글

[C] 분할 컴파일과 라이브러리  (0) 2024.02.18
[C] 조건부 컴파일과 매크로 함수  (0) 2024.02.18
[C] 입출력 리디렉션, 커맨드 라인 인자  (0) 2024.02.17
[C] 파일 입출력 (2)  (0) 2024.02.16
[C] 파일 입출력 (1)  (0) 2024.02.16
'C/[코드조선] C 핵심' 카테고리의 다른 글
  • [C] 분할 컴파일과 라이브러리
  • [C] 조건부 컴파일과 매크로 함수
  • [C] 입출력 리디렉션, 커맨드 라인 인자
  • [C] 파일 입출력 (2)
묻공러
묻공러
묻지마공부묻공러 님의 블로그입니다.
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.