On this page
article
C++ Variable
새로운 데이터 타입
char16_t (UTF16, cpp11)
char32_t (UTF32, cpp11)
char8_t (UTF8, cpp20)
https://velog.io/@ts6938/UTF-8%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
UTF-8 : 1~4byte 사이로 인코딩하는 가변 길이 인코딩 방식
UTF-16: 2byte 가변길이 인코딩 방식 → 영문과 한글이 2byte라 UTF-8에 비해 저장 공간 효율성이 있으나 byte ordering고려해야함
UTF-32: 모든 문자를 4바이트 고정 길이로 인코딩해서 편리하나 저장공간 사용 많음
BOM(Byte Order Mark): 바이트 순서 표시
auto/decltype/nullptr
auto (c++11)
- 한 쪽의 데이터 타입이 변경됐을 때 바로 대응가능
int x[5] = {1,..} auto n1 = x[0];
decltype (c++11)
decltype(n1) n3 // 기본 사용법 int foo (int a, double d) decltype(foo) d1; // 함수 타입 decltype(&foo) d2; // 함수 포인터 타입 decltype(foo(1, 3.1)) d3; // 함수 반환 타입 // 실제 함수가 호출되지않아서 unevaluated expression이라고 함 #include <typeinfo> cout << typeid(d1).name() << endl; // 타입검출 (!const, volatile, reference 검출 불가, boost 필요)
- n1의 타입으로 n3 결정
컴파일 시간에 결정되므로 실행시간 오버헤드는 없음
유의
int x[3] = {1,2,3} auto a2 = x; // int* decltype(x) d2; // int d2[3] decltype(x) d3 = x; // error int y[2] = {1,2} auto a4 = y[0]; // int decltype(y[0]) d4; // int&
nullptr
- 리터럴
- 소스 코드 내에서 사용되는 고정된 값
- 모든 리터럴은 데이터 타입이 있음
- 정의
- pointer literal
- 데이터 타입은
- 암시적 변환
- 모든 포인터 타입으로 암시적 변환 가능
- int 타입으로는 변환 불가
- bool의 경우 복사 초기화는 불가, 직접 초기화는 가능
bool b1 = nullptr // error bool b2 {nullptr}
- 리터럴
using
- C++ 11부터 도입
- using은 타입 뿐 아니라 템플릿의 별칭도 만들 수 있음
typedef int DWORD;
typedef void(*F)(int, int);
using DWORD = int;
using F = void(*)(int, int);
linkage
- 정의
- 어떤 심볼이 자신이 정의된 컴파일 단위(파일) 외에서도 접근가능한가
- 종류
- Interanl(같은 파일) ↔ external(모든 파일)
- 헤더 파일에 함수 구현 넣기
- static, inline function만 가능
- 차이
- static같은 경우 a.cpp와 b.cpp의 함수는 다른 함수. 주소가 다름
- inline은 동일 주소
- no linkage
- 특정 scope 안에서 만들어져서 같은 파일이라도 접근 불가능한 케이스
- 결론
- header에는 internal linkage만 넣을 수 있음.
- inline은 multiple definition이 허용되는 특별한 경우
- 변수의 경우 static, const, inline var이 가능
// linkage.h static int s = 0; // linkage.h를 include한 파일들에서 다른 주소 const int x = 0; // 다른 주소 inline int y = 0; // 같은 주소