'프로그래밍/c,c++'에 해당되는 글 14건
책 "전문가를 위한 C++" - 1.1 C++의 기초
프로그래밍/c,c++ 2021. 1. 5. 17:33"전문가를 위한 C++" 내용 정리
www.yes24.com/Product/Goods/77669043
namespace - 이름이 충돌하는 문제를 해결하기 위해 나온 개념
내가 작성한 코드의 함수명과 외부 라이브러리의 함수명이 같을 때
mycode.h
namespace mycode {
void foo();
}
mycode.cpp
namespace mycode {
void foo() {
std::cout << "foo() called in the mycode namespace" << std::endl;
}
}
mycode::foo();
using namespace mycode;
foo();
한 파일에서 using 을 여러개 사용하면 namespace를 사용하지 않는 것과 동일 한 상황이 됨
특정 항목에 대해서만 using 사용 가능함
using std::cout;
cout << "Hello world" << std::endl;
casting - c++ 방법 : i3
float myFloat = 3.14f;
int i1 = (int)myFloat;
int i2 = int(myFloat);
int i3 = static_cast<int>(myFloat);
연산자 - 우선순위 애매하면 ()
int i = 34 + 8 * 2 + 21 / 7 % 2;
int i = 34 + (8 * 2) + ((21 / 7) % 2);
enum 타입
const int PieceTypeKing = 0;
const int PieceTypeQueen = 1;
const int PieceTypeRook = 2;
const int PieceTypePawn = 3;
int myPiece = PieceTypeKing;
enum PieceType {
PieceTypeKing,
PieceTypeQueen,
PieceTypeRook,
PieceTypePawn
};
PieceType myPiece;
myPiece = 0; // ERROR
엄격한 타입(형변환 방지 및 사용 범위 지정)
enum class PieceType {
King = 1,
Queen,
Rook = 10,
Pawn
};
if (PieceType::Queen == 2) { ... } // ERROR
if (static_cast<int>(PieceType::Queen) == 2) { ... }
저장 되는 타입 지정 가능
enum class PieceType : unsigned long {
King = 1,
Queen,
Rook = 10,
Pawn
};
bool 타입 : true, false
함수 리턴 타입 추론
여러개 return 이 있을 경우 모두 동일 타입이어야 함
auto addNumbers(int number1, int number2) {
return number1 + number2;
}
배열 - c스타일 대신 std::array
장점 : 크기 명확, 자동 포인터 형변환 방지, 반복자로 배열 원소 접근
array<int, 3>arr = { 1, 2, 3 };
cout << "size = " << arr.size() << endl;
cout << "2nd = " << arr[1] << endl;
std::vector - 자동 확장
vector<int>vec = { 1, 2, 3 };
cout << "size = " << vec.size() << endl;
cout << "2nd = " << vec[1] << endl;
vec.push_back(4);
cout << "size = " << vec.size() << endl;
cout << "4th = " << vec[3] << endl;
범위 기반 for 문
std::array<int, 4> arr = { 1, 2, 3, 4};
for (int i : arr) {
std::cout << i << std::endl;
}
int carr[4] = { 5, 6, 7, 8 };
for (int i : carr) {
std::cout << i << std::endl;
}
initializer list
include <initializer_list>
클래스 템플릿, 타입 세이프
int a = makeSum({ 1, 2, 3 });
int b = makeSum({ 10, 20, 30, 40, 50, 60 });
// int c = makeSum({ 1, 2, 3.0 }); // ERROR
cout << "a = " << a << ", b = " << b << endl;
strncpy, snprintf, strncmp 같은 버퍼 크기 지정 함수 사용시 자주 보이는 실수
프로그래밍/c,c++ 2020. 12. 6. 13:33strncpy, snprintf : 버퍼 크기를 source 문자열 크기로 지정함 => destnation 버퍼 크기로 지정해야함
개발시 동일 함수내 src 와 dst 크기가 같은 경우가 많아 문제가 발생하는 경우가 적지만
함수 인자로 src를 받을때 심각한 문제 발생함
char* src = "012345678";
char dst[5] = { 0, };
strncpy(dst, src, strlen(src)); // 버퍼 오버플로우 발생
snprintf(dst, strlen(src), "%s", src); // 버퍼 오버플로우 발생
strncmp : 문자열 비교를 위 함수 처럼 버퍼 크기를 벗어나지 않는 용도로 사용하여 의도치 않는 결과 발생함
갯수를 지정할 때는 문자열 앞 n 글자만 비교가 필요할 경우만 사용, 문자열 전체 비교는 strcmp
char* str1 = "";
char* str2 = "abcd";
strncmp(str1, str2, strlen(str1)); // return 0 : 같음, n 값이 0으로 문자 비교 없음
strncmp(str1, str2, strlen(str2)); // return 0 이 아닌값 : 다름
char* str3 = "ab";
char* str4 = "abcd";
strncmp(str3, str4, strlen(str3)); // return 0 : 같음, 앞 2글자 비교
strncmp(str3, str4, strlen(str4)); // return 0 이 아닌값 : 다름
strcpy, strncpy, sprintf, snprintf 안전하게 사용하기
프로그래밍/c,c++ 2020. 12. 1. 10:24strcpy : src 의 길이가 dst 의 길이 보다 작아야 한다.
char *src = "AAA";
char dst[10] = { 0, };
if (strlen(src) < sizeof(dst) {
strcpy(dst, src);
}
strncpy : src 길이가 dst 보다 크거나 같으면 dst 마지막에 '\0' 이 없어지기 때문에 dst length - 1로 n 값을 설정해야 한다.
char *src = "AAA";
char dst[10] = { 0, };
strncpy(dst, src, sizeof(dst) - 1);
sprintf : format 문자열이 dst를 넘지 않아야 한다.
snprintf : 길이 n의 마지막에는 '\0' 값이 들어간다는 것을 염두에 두고 길이 값을 설정한다.
char *src = "aaaaa"
int src2 = 10000
char dst[10] = { 0, };
snprintf(dst, sizeof(dst), "%s%d", src, src2); // "aaaaa1000" 마지막 문자가 짤린다.