1. 전처리기

JUSTICE_DER·2023년 12월 17일
0

C++

목록 보기
15/20

참고
MSDN

씹어먹는 C++

#pragma
#pragma 2

C++ stdio.h

cout .. printf 차이
cout .. printf 차이 2

C++ 링커는 항상 표준라이브러리를 연결?

using namespace

1. C++ 전처리기란 무엇인가?

  • 전처리 지시문이 붙은 코드를 의미
  • C++의 코드를 실제 실행할 수 있는 파일로 변환하는 컴파일 과정
    전처리단계에서 전처리기를 수행한다.
  • 전처리단계에서 소스코드가 컴파일러로 전달되기 전에
    전처리기를 통하여 특정 준비작업들을 수행할 수 있다.
  • #이 붙으면 컴파일 전에 컴파일러가 어떤 작업을 수행해야 함을 의미하고,
    그 뒤의 전처기 지시문을 실행한다.

2. 전처리기 지시문 종류

  • 일반적으로 소스 프로그램을 쉽게 변경하고
    다른 실행 환경에서 컴파일하기 쉽게 만드는 데 사용
    • 전처리기 코드 줄은 매크로 확장 전에 인식되고 수행된다.
      따라서 매크로가 전처리기 명령처럼 보이는 것으로
      확장되면 전처리기에서 인식되지 않는다.
      (아직 이 말의 의미는 모르겠지만 중요해 보인다 - 매크로가 뭘까)
    • 전처리기 지시문은 원본 파일의 아무 곳에나 나타날 수 있지만,
      소스 파일이 나타난 후에는 나머지 원본 파일에만 적용됩니다.
      (무슨말일까, 소스코드 전에 나온다면 해당 파일에도 적용되지만,
      소스코드 후에 나온다면, 그 소스코드를 제외한 것에 적용?)

현재까지 사용한 2개의 전처리기 지시문

  • #include
    ㄴ 특정 헤더파일이나, 다른 소스파일의 내용을 현재 코드에 포함시킨다.

ㄴ include 뒤에 올 수 있는 종류는? cpp파일도 가능?
ㄴ (헤더파일의 종류 3가지)
헤더 파일은 3종류가 있다.
<> : 표준 / "" : 사용자 정의 / .../ : 파일경로

#pragma
ㄴ 컴파일러에게 말하는 전처리기 명령.
ㄴ 컴파일러마다 문법이 다르다
= 컴파일러에 종속된 키워드.
ㄴ once, comment, warning, data_seg 등 다양한 명령어가 올 수 있다.
각 명령어의 기능은 모두 다르고, 지원되는 컴파일러만 가능하다.
Pragma의 기능은 매우 다양해서 따로 탭문서로 정리되어있다.

  • #pragma region
    해당 명령어를 사용했는데, 접고 펼 수 있는 코드 블럭을 생성한다.
    이름을 설정할 수도 있다. 따라서 단순 가독성을 높임.

/* 아직 사용하지 않았음으로 일단 스킵

  • #define
    ㄴ 특정 식별자를 문자열로 바꿈
#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )
var = LENGTH * 20;
var = ( 80 + 10 ) * 20; // LENGTH에 괄호가 있을 경우
var = 80 + 10 * 20; // 괄호가 없는 경우, 연산이 달라짐

#import
#using

#error

#if
#elif
#else
#endif

#ifdef
#ifndef

#line
#undef
*/

3. #include <iostream>의 의미?

  • 우선 헤더파일의 종류에 대해 알아야 한다
  • 컴파일러는 < >라는 것은 미리 정의된 VisualStudio 표준경로에 저장된
    파일을 이름으로 접근하여 찾는다.
  • 컴파일러는 해당 파일을 찾아 현재 프로젝트에 포함시킨다.
  • 포함시키는 방법은 해당 파일을 복사한다.
  • a.cpp와 b.cpp 모두 안에 std라는 namespace가 있다고 할 때,
    a와 b를 c에 추가하면, std:: 스코프 지정 연산자로, a와 b의 std에 동시에 접근할 수 있다.
  • 따라서, iostream이라는 헤더파일을 가져온다면, 내부적으로 std로 감싸져 있고,
    해당 기능에 접근하기 위해서, std::cin, std::cout을 통해 접근한다.

ㄴ 그렇다면 왜 using std::cin, using std::cout을 하는 것이 낭비하지 않고 효율적일까?
ㄴ 어짜피 include를 하면 전처리기에 의해 해당 파일을 복사해올텐데
이미 선언된 std에서 cin, cout 기능을 가져다 쓰게 되는 것인데 왜??

  • C 표준 라이브러리
    C 표준 라이브러리의 각 헤더들은 C++ 표준 라이브러리에서 다른 이름으로, .h를 제거하고 처음에 'c'를 추가한 상태로 생성된 채 포함된다
    예를 들면 'time.h'는 'ctime'이 된다.
  • 이러한 헤더들과 전통적인 C 표준 라이브러리 헤더들의 차이점은
    std:: 이름 공간의 어디에 함수들이 위치할 수 있느냐이다..?

    <cstdio>, <stdio.h>
    stdio.h인 C 헤더는 global namespace
    cstdio인 C++ 헤더는 std namespace를 사용한다고 한다.

ㄴ 그리고 직접 들어가서 살펴보니, cstdio를 추가해도,
안에 #include <stdio.h>로 어짜피 헤더는 추가되어있다.

그런데 왜 printf는 stdio.h, cstdio 선언없이 바로 사용할 수 있는거지???????
알려면 일단 표준 라이브러리가 뭔지 알아야 할듯
ㄴ #include를 하면 복사를 실행한다. 표준 라이브러리에 복사한다?라고 함.
그래서 표준라이브러리에서 끄집어 내야 함
ㄴ 표준 라이브러리에 포함이 되어있기 때문에, 표준을 걸쳐서 가야 한다?
ㄴ using namespace std::로 cin, cout을 꺼내서 사용한다.
ㄴ 왜 std라는 namespace를 통해서 사용해야할까??

<iostream>
보통 C++에서는 iostream을 사용하여 입출력을
cin cout 등으로 지원하는데,
해당 함수가 C의 printf에 비해 장점이 많다고 한다.

  • 대부분의 장점은 printf는 %로 타입을 지정해야하는데,
    C++는 그렇지 않고 출력하기 때문에 더 효율적이라고 한다.
  • 추가로 iostream 내부에는 또 istream이 include 되어있고,
    그 내부에는 또 ostream이 include 되어있어서
    각각 사용하고 싶은 것만 확장시키는 데에도 용이하게 계층이 나눠졌다고 함.
profile
Time Waits for No One

0개의 댓글