C & C++ 31

[C] C language의 연산자 우선순위는 설계 실수인가?

최근 흥미로운 내용을 접했다. C language의 연산자 우선순위에 설계상 결함이 있다는 이야기다. 전설의 C에 언어 설계 결함이 있을 수 있나? 라는 생각이 들었다. (지금도 결함 정도로 생각되진 않지만) 내용은 이렇다. & | 연산자와 == 연산자 간의 연산자 우선 순위로 인해 실수할 여지가 크다는 내용이다. & | 보다 ==의 연산자 우선순위가 더 높기 때문에 문제가 될 수 있다고 한다. 아래 코드가 있다고 보자. if (a & b == c) { // ... } 위 코드는 a&b의 결과가 c와 동등한지 확인하는 코드가 아니다. 오히려 b==c가 먼저 평가되고 그 결과와 a와 bit and를 한다. (당연히도) 해당 의견을 접하고 먼저 든 생각은 이렇다. 이게 왜 설계상 오류일까? 연산자 우선순위가..

C & C++/C 2024.01.01

[C++] C++ 기초 개념 정리

1. 레퍼런스 = 참조자 레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정해야 한다. int& another_a; 이렇게 하는건 불가능함. 반면에 포인터는 int* p; 이렇게 하는게 가능함. 또한 레퍼런스는 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없다. 또한 레퍼런스는 메모리 상에 존재하지 않을 수도 있다. 진짜 그냥 별명이라고 생각하면 된다. 왜 포인터 대신 참조자를 사용할까? 불필요하게 *나 &를 많이 쓸 필요가 없기 때문이다. 레퍼런스는 있는데 원래 참조하던 것이 사라진 것을 댕글링 레퍼런스라고 한다. 그러니 지역 변수의 레퍼런스를 리턴하지 않도록 주의하자. 레퍼런스를 리턴하는 장점? 레퍼런스가 참조하는 타입의 크기와 상관 없이 딱 한 번의 주소값 복사로 전달이 끝나게 됨. 하지..

C & C++/C++ 2022.11.13

[C++] C++ RapidJSON 라이브러리 사용법

사용법은 간단하게 아래와 같다. 아래 블로그에 tutorial 에 굉장히 친절하게 설명되어있다. 감사합니다. https://rapidjson.org/md_doc_tutorial.html RapidJSON: Tutorial This tutorial introduces the basics of the Document Object Model(DOM) API. As shown in Usage at a glance, JSON can be parsed into a DOM, and then the DOM can be queried and modified easily, and finally be converted back to JSON. Value & Document Each JSON rapidjson.org

C & C++/C++ 2022.11.10

[C++] C++ select api와 inet_ntop api 정리

c++ socket programming 을 하던 중 select api 가 어떻게 동작하는지 알지 못해서 코드를 읽는 도중에 흐름이 끊겼다. 알아보고 지나가자. 또한 inet_ntop api 에 대해서도 간략하게 알아보자. select api 를 설명하기 전에 멀티플렉싱 서버에 대해 설명해야한다. 멀티플렉싱 서버란 하나의 프로세스로 여러 클라이어트에 서비스를 하는 서버이다. 멀티플렉싱 서버에서는 하나의 프로세스가 서버 소켓 + 여러 클라이언트 소켓을 관리한다. 관리할때 fd_set 이라는 구조체를 사용한다고 보면 된다. 이 fd_set 은 배열 형태인데 인텍스로 매핑하기 위해 쓴다고 보면 된다. 그냥 bit array 에 특정 index 에 체크해준다고 생각하면 된다. 아래와 같은 함수가 있다. FD_..

C & C++/C++ 2022.11.10

[C++] C++ listen api 의 parameter 중 backlog.

C++ 을 사용해서 소켓 프로그래밍을 하던 중 listen api 에서 두번째 인자로 넘겨주는 backlog 라는 파라미터에 대해 정확하게 알고 있지 못했다. 우선 리눅스 메뉴얼에 들어가서 listen api 의 backlog 파라미터의 설명을 보면 다음과 같이 적혀있다. 즉 간단하게 보자면 큐 사이즈를 지정한다는 내용이다. 그런데 어떤 큐 사이즈를 지정하는것일까? 이제 아래 그림을 보자. 왼쪽이 서버에서 동시에 응답할 수 있는 최대 갯수라고 가정한다면 (현재로썬 3개) backlog 값이 5라고 했을때 아래와 같은 상황이 연출되는 것이다. 가운데 있는 listen backlog queue의 사이즈가 5로 잡혀있는 것이다. 그러니 10개의 요청이 들어왔을때 1, 2, 3 은 서버쪽에서 처리하고 있고 아직..

C & C++/C++ 2022.11.10

[C++] C++ 헷갈리는 개념 간단 정리 (2)

1. #include 순서 include 하는 헤더파일에도 순서가 있다. 1) 시스템 라이브러리의 헤더파일 2) 다른 라이브러리의 헤더파일 3) 현재 프로젝트의 헤더파일 이 순서로 나열하면 가독성을 높일 수 있고 종속성도 피할 수 있다고 한다. (참고로 이 문제는 오늘 아침에 직접 겪었는데 redis 와 winsock2 헤더는 서로 충돌한다. winsock2를 아래로 내려주니 작동하는 것을 확인할 수 있었다. ) 2) ZeroMemory() 구조체를 초기화할때 쓰인다. ZeroMemory랑 memset은 그냥 같다고 보면 된다. 다만 memset 의 경우에 메모리를 인자로 받은 char형 변수(1byte)로 채워주고 ZeroMemory는 메모리를 0으로 채워준다는 점이 다르다고 한다. 오버헤드 차이도 별..

C & C++/C++ 2022.11.09

[C++] Visual Studio 2022 에서 C++ rapidjson 사용하기

c++ 프로젝트에서 json 으로 서버와 주고받을 일이 생겨 관련 라이브러리를 사용해보고자 한다. c++ 에서 json 을 주고 받기 위해서는 rapidjson 을 주로 사용한다고 한다. 사실상 쓰는 방법은 굉장히 간단한데 세팅하는 방법이 조금 투박하다. 아래처럼 잘 따라하면 rapidjson을 사용할 수 있는 환경을 갖출 수 있을 것이다. 우선 아래 github에 접속하자. https://github.com/Tencent/rapidjson 접속하면 아래와 같이 직접 zip 파일을 받던 clone을 하던 어떻게든 소스코드를 받는다. 받고나면 include 라는 폴더가 보일텐데 다른 파일들은 사실상 필요없고 include/rapidjson 만 필요하다. 위와 같이 include/rapidjson 이 있는데..

C & C++/C++ 2022.11.08
반응형