참고
MSDN
- 전처리기 코드 줄은 매크로 확장 전에 인식되고 수행된다.
따라서 매크로가 전처리기 명령처럼 보이는 것으로
확장되면 전처리기에서 인식되지 않는다.
(아직 이 말의 의미는 모르겠지만 중요해 보인다 - 매크로가 뭘까)- 전처리기 지시문은 원본 파일의 아무 곳에나 나타날 수 있지만,
소스 파일이 나타난 후에는 나머지 원본 파일에만 적용됩니다.
(무슨말일까, 소스코드 전에 나온다면 해당 파일에도 적용되지만,
소스코드 후에 나온다면, 그 소스코드를 제외한 것에 적용?)
현재까지 사용한 2개의 전처리기 지시문
ㄴ 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
*/
- 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 기능을 가져다 쓰게 되는 것인데 왜??
예를 들면 'time.h'는 'ctime'이 된다.
<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 되어있어서
각각 사용하고 싶은 것만 확장시키는 데에도 용이하게 계층이 나눠졌다고 함.