현대적인 언어 형태로 C++로 개발하기

그냥 개인적으로 생각하던 거 올릴 곳도 없고 해서 올려봅니다.
내용이 반말이라 죄송합니다. 좀 강하게 딱 필요한것만 적은거라서요.
제가 생각하기엔 이정도만 지켜도 현대적인 언어 못지않게 개발이 가능하고 또 메모리릭 같은것에서
벗어날 겁니다.

  1. C++17이상을 지원하는 컴파일러만 사용하자.
  2. pointer를 사용하지 말자.
    2.1. 메모리 할당이 필요한곳에는 std::shared_ptr, std::unique_ptr을 사용하자.
    2.2. pointer는 인자 또는 legacy api에만 사용하자.
  3. 변수에 타입을 나타내는 접두사를 붙이지 말자.
  4. 천저리기나 맥크로 사용을 최소화 하자.
    4.1. 함수형태의 전처리기 사용금지. inline으로 충분하다.
    4.2. 전처리기 상수를 만들지 말자. constexpr, static등으로 충분하다.
    4.3. 컴파일 분기를 위한 전처리기만 사용하자.
  5. STL을 적극 활용하자. 어지간한건 STL에 전부 있다.
  6. lambda를 적극 활용하자.
  7. thread가 필요하면 STL를 찾아라. 종류별로 있다.
  8. 전역 변수를 만들지 말자.
    8.1. 프로그램 설정등을 저장할 곳이 필요하면 singleton 패턴을 사용하는 클래스를 하나 만들어라.
  9. 형변환이 필요한곳에 (char)같은 C스타일 캐스팅을 사용하지 말자.
    9.1. C++타입 캐스팅(static_cast, reinterpret_cast, dynamic_cast)을 사용하자.
    9.2. stl 타입을 형변환할 경우 stl에도 cast가 있다.
  10. template을 사용하자. 가급적 “<class T>” 형태로 사용하자. 남발금지
  11. enum class 를 사용하자.
  12. 함수에 noexcept, throw() 를 사용하자.
    12.1. 작은 규모의 함수는 예외처리를 확실히 하고 noexcept를 사용하자.
  13. try, catch를 사용하자.
  14. 인터페이스를 변수로 만들 경우 접두사i를 붙이자.
  15. class를 만들때는 한가지 용도로만 만들자. 여러가지 기능이 필요하면 기능별 class를 만들고 그 class들을 내부적으로 사용하거나 다중상속하는 class를 만들자.
  16. 미래에 사용할지도 모를 멤버 변수, 멤버 함수는 만들지 말자.

부록

  1. std::shared_ptr, std::weak_ptr 사용법을 통달하자.
  2. std::function과 std::bind 사용법을 통달하자.
  3. lambda 사용법을 통달하자.
  4. std::thread, std::promise, std::future, std::packaged_task, std::async 사용법을 통달하자.
  5. std::atomic 사용법을 통달하자.
13개의 좋아요

내용에는 공감이 갑니다. 저도 고인물이라 Qt 같은 프로젝트 말고는 구식 C++ 방식으로 코딩하는데(링크드 리스트도 직접 만들어 씁니다 -_-;:wink: 문제는 기존 레거시 코드가 c++11 이전 방식으로 전부 코딩되어있고 크로스 플랫폼 지원이 가능해야해서 혹시나 빌드가 안될까싶어 수정을 못하는 상황이네요…
윈도우/리눅스/안드로이드 등등에서 다 빌드가 되어야하거든요. low level API 들은 전부 c로 되어있는데 최악의 경우 마이컴 펌웨어로도 빌드가 되어야합니다.
저도 최신 C++ 문법으로 개발해보고 싶네요.

1개의 좋아요

당연히 그런 경우는 방법이 없죠.
제가 적은 경우에 해당되는 건 현재는 윈도우, 리눅스죠.
아마~ 안드로이드도 될 듯 싶긴한데. 버전에 따라서 다르지 않을까 싶네요.
뭐~ 언젠가는 다 되지 않겠습니까? ^^

1개의 좋아요

좋은 정보 감사합니다 !!!
(북마크 꽝)

1개의 좋아요

c++ 버전별 마이그레이션 문제라면 std 대체재로 boost 라이브러리 사용도 고려해보셔요.

저 같은 경우는,
try,catch는 남발하면 성능에 영향을 줄 수 있어서 파일입출력이나 통신 같은 부분에서 주로 사용하구요
(예측치 못한 에러가 아니면 코드문제라 보고;:wink:

17 이상 컴파일러 사용 너무 환영합니다…

2개의 좋아요

가끔 댓글로 괜찮다 싶은거 추가 하겠습니다.

C++ 에서 포인터 사용 시 자동 삭제까지 되는 방법으로는
std::shared_ptr, std::unique_ptr이 있으나 사용이 번거롭죠.
공유 사용이나 std::unique같은 방식이 꼭 필요한 것 아니라면 std::vector 쓰면 됩니다.
벡터는 내부적으로 그냥 포인터에 메모리 할당을 하고 있습니다.
C++ 17이상에서는 얼라인드 말록도 사용이 가능하므로 다용도로 쓰기에 좋습니다.
pointer를 받아서 쓰는것이 필요할 경우 ::data()를 사용하면 첫번째 포인터가 리턴 됩니다.
주의사항은 reserve와 resize의 사용정도 되겠네요.

2개의 좋아요

try catch는 실제로 여러곳에서의 테스트에서 속도에 무관하다고 하고는 있으나…
찜찜하기는 하죠. 그래서 저도 초기화 부분 외에는 거의 안쓰고 있네요.

1개의 좋아요