C & C++ 27

[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

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

1. C++ member initializer lists (멤버 초기화 리스트) -> 생성자 괄호 뒤에 콜론으로 표시해서 초기화할 멤버 변수들을 명시해줌. -> 간단하게 : 뒤에 쓰는건데 괄호 안에 어떻게 초기화할건지 값 명시해준다고 보면 됨. 2. tcp::acceptor -> socket에서 사용하는 acceptor와 동일한 존재이다. -> 말 그대로 accept 를 시작하는 녀석이다. -> 여기서 생성한 acceptor를 가지고 async_accept를 호출해서 비동기 accept를 시작하는 셈이다. 3. tcp::socket -> stream-oriented socket 기능을 제공한다. 그냥 socket 통신할때 필요한 변수라고 보면 된다. 4. 스마트 포인터 스마트 포인터에는 세가지 종류가 있..

C & C++/C++ 2022.11.07

[C++] 임시 객체란 무엇인가? Temporary Object?

최근에 공부를 하던 중 교수님게서 C++ lock guard의 특정 동작에서 발생하는 버그를 말씀해주시면서 임시 객체라는 표현이 등장했다. 임시 객체라는 표현이 들어본 것 같으면서도 정확히 뭔지는 모르고 있다는 생각이 들었다. 예상하기론 다른 동작을 위해 생성되어 잠시 동안만 존재하고 희생적으로 사용되는 객체일 수 있겠다는 추측을 했다. 추측을 하고 났으니 이제 정확한 개념에 대해서 알아보자. 임시 객체는 실행 도중에 잠깐만 사용되는 객체이다. 소스 코드에도 없는 힙 이외의 공간에 생성된다고 한다. 그런데 임시 객체는 성능 저하를 유발하는 원인이 되기 때문에 Call by reference를 해서 임시 객체를 만들어주지 않는 것이 좋다고 한다. 참고로 이 예제는 C++을 예시로 들어 설명하고 있는 예제를..

C & C++/C++ 2022.10.19

[C] 환경변수를 출력하는 envp의 미스터리한 동작 발견. 이유가 대체 뭘까요? <extern char ** environ;> (1)

야밤에 치킨을 먹고 쉬던 와중에 친구에게 연락이 왔다. 그리고 친구와 오랜만에 c 코드를 잠깐 살피게 되었다. 간단한 코드인데 어떻게 제출할지가 살짝 애매해서 고민하고 있었다. 방법을 찾으려고 이것 저것 건드려보면서 30분은 떠든것 같다. 그러다가 굉장히 납득하기 어려운 동작을 하는 코드가 탄생했다. 아무리 생각해도 이해가 가지 않는 동작이라 조금만 더 살펴볼까 한다. 분명 우리가 모르는 무언가가 있을 것이라고 생각하고 이리저리 살펴봤는데도 그럼에도 불구하고 신기한 코드이다. 이제부터 설명을 하도록 하겠다. 우선 우리의 목적은 간단하다. /usr/bin/env 는 환경변수를 모두 출력시키는 동작을 한다. 그리고 우리는 그 환경변수에 ENV1=value1, ENV2=value2 라는 path 또한 추가해서..

C & C++/C 2022.04.13

[C++] C++ 에도 annotation이 존재할까?

요즘 springboot를 사용하면서 프로젝트를 진행중이라서 잔뜩 annotation을 사용중이었다. 그런데 문뜩 c++에도 annotation을 쓰는가? 에 대한 궁금증이 번졌다. 그래서 검색해보았는데 이렇다 할 annotation이라는건 없었고 그 대신에 generalized attributes 라는 기능을 쓴다고 한다. 아래 스택오버플로우의 답변들을 보면 뭘 말하는지 알 수 있다. https://www.codesynthesis.com/~boris/blog/2012/04/18/cxx11-generalized-attributes/ C++11 generalized attributes Generalized attributes are a new C++11 core language feature that is..

C & C++/C++ 2022.01.03

[C] C언어 질문: 두 배열 a와 b에서 b = a 에서 에러가 발생하는 이유는 무엇일까?

새벽에 누군가가 재밌는 질문을 올려놨다. 짧은 글이라 그냥 휙 보고 넘기려 했다. 그런데 글을 보고 고민했는데 나도 감이 잡히질 않아서 아침에 직접 dev C++를 켜고 값을 찍어보았다. 올라온 질문은 다음과 같았다. 배열은 포인터와 유사하지만 포인터 상수이다. 즉 대입이 불가능하다. 근데 왜 전자의 경우에선 오류가 나지 않고 후자의 경우에서 오류가 발생하는가? void function(int a[]){ int b[5]; a = b; } void main(){ int a[10]; function(a); } void main(){ int a[10]; int b[4]; b = a; } 배열은 배열의 첫 번째 요소의 주소값을 가지고 있는 것이다. 배열 변수는 주소값을 받을 수 있으니 b = a; 와 같이 만든..

C & C++/C 2021.11.21

[C] 시스템 프로그래밍

예전에 공부하면서 작성했던 C system programming 예제를 첨부한다.  전반적인 시스템 코드 작성 예제가 두루 포함되어있어서 도움이 많이 될거다.   2주차 code3-1#include#include#include#includeint main(){ int filedes; char fname[] = "afile"; if((filedes = open(fname, O_RDWR)) == -1){ printf("%s cannot be opened. \n", fname); } close(filedes); return 0; }code3-2#include#include#include#define PERMS 0644char *filename = "newfile";void main(){ int fd; if(..

C & C++/C 2021.11.08

[C] 포인터가 가질 수 있는 값인 nil이란?

포인터가 가질 수 있는 값들 중에 nil이 있다는 글을 봤다. null의 오타겠거니 생각했다. null을 잘못적었구나 라고 생각했는데 실제로 nil이라는 걸 사용한다고 한다. swift에서 null대신 nil을 사용한다고 한다. 즉 swift에서는 null이없어서 그대신 nil이라는 개념을 쓴다고 한다. 그리고 사실 nil의 기본적의 정의 자체는 꼭 스위프트에서만이 아니라 "다양한 컴퓨터 프로그래밍 언어에서의 널포인터의 이름" 라고 정의된다. 즉 별다른거 없다. 그냥 null 인거다. 다만 다르게 부를 뿐이다. 그러니 앞으로 어떤 랭귀지든 nil이라는게 나오면 아 여기서는 null대신 이걸 쓰는구나 라고 알면 되겠다.

C & C++/C 2021.10.17

[Linux] exit과 _exit의 차이

리눅스 시스템 프로그래밍을 할적에 _exit을 본적이 있는데 exit은 main문제에서 쓰이는 반면 _exit은 자식 프로세스의 동작이 확실시되는 곳에서 사용되는 경우가 있었다. 둘 사이의 차이가 사후처리 즉 뒤처리를 하고 종료하느냐 하지 않느냐의 차이로 알고 있었는데 자식 process에서 쓰이는걸 보면 뭔가 이유가 있겠다 싶었다. 아래가 해당 자세한 내용이다. exit() 함수는 표준 입출력 정리 루틴을 수행하고 _exit()를 호출한다. exit() 함수는 파일 스트림에 대해서 동일한 작업을 수행하는데, 열려있는 파일의 스트림에 대해서는 fclose() 함수를 호출해서 버퍼에 남은 데이터를 모두 출력(flush)한다 일반적으로 _exit() 함수는 표준 입출력과 관련된 정리 작업을 수행하지 않는 것..

C & C++/C 2021.10.12

[C] 메모리와 변수의 lifetime으로 인한 예상치 못한 결과

글 앞 내용에 잘못된 내용이 등장합니다. 혼자서 추측했던 내용이라 잘못된 내용인데 그냥 결과만 확인하고 싶은 분은 글 맨아래로 가셔서 파란색 문단을 읽으시면 됩니다.  굉장히 신기한 내용을 접하게 되었다. 우선 아래 코드를 먼저 보면 아주 간단한 코드인데 척 보면 무슨 결과가 나올지 짐작일 갈 것이다.  #include int fun() { static int count = 0; count++; return count; } int main() { printf("%d ", fun()); printf("%d ", fun()); return 0; } 위와같은 코드를 봤을때, 딱 보면 아 static으로 선언되있기는 한데 그런데 어차피 다시 또 0으로 초기화를 해주기 때문에 결과가 1 1 이 나오겠구나라고 생각..

C & C++/C 2021.10.08

[Linux] Ubuntu c programming - file open /read /write

오랜만에 우분투에서 또다시 코드를 작성하게 되었다. 예전에는 리눅스에서 뭔가 작성한다고 하면 잔뜩 겁을 먹었었는데 지난번에 어셈블리어 수업을 듣게 된 이후로는 그나마 덜한 것 같다. 그전까지는 아예 기본적인 사용법조차 몰랐고 터미널에서 길을 잃어서 한참을 헤맸던 기억이 난다. 한마디로 별것도 아닌일때문에 삽질을 좀 많이 했었다. 그래도 지금은 좀 나아진것 같다. 지난번에는 Vmware WorksStation을 사용해서 작성했었는데 이번에는 Oracle VM VirtualBox를 이용해서 우분투에서 작성하게 되었다. 두 제품의 차이에 대해서는 잘 모르는데 나중에 이부분도 따로 찾아서 정리해놓으면 좋을 것 같다. 근데 사실 막상 써보면 별 차이 없긴 하다. 시스템 콜을 사용해서 아주 간단한 프로그램을 작성하..

C & C++/C 2021.09.30

[C] C언어 세그멘테이션 오류 (코어 덤프됨)

리눅스에서 c언어로 시스템 프로그래밍 관련 코드를 작성하고 있었는데 세그멘테이션 오류(코어 덤프됨) 이라는 에러가 발생했다. 예전에도 한번 발생했던 기억이 있는데 그 당시에 오류 원인은 찾지 못했고 코드를 고쳐주었더니 해결된 적이 있었다. 세그멘테이션 오류는 - 포인터를 잘못 사용했을 경우 - 혹은 배열의 메모리를 잘못 사용했을 경우 - 포인터로 지정해놓고 초기화도 메모리 할당도 안해줬을 경우 위와 같은 경우에 발생한다고 한다. 나의 경우 지금은 에러가 사라져서 원인이 뭐였는지 확실하게 짚이지는 않는데 아마 터미널에서 아규먼트를 전달했어야 했는데 전달하지 않았으면서 내부 코드에서 그 요소를 사용하려고 접근했기 때문이 아닐까 라고 예상된다. int main(int argc, char* argv[]) { /..

C & C++/C 2021.09.29

[Linux] fcntl.h와 unistd.h

매번 include하여 사용했는데 왜 쓰는지 몰랐던 헤더가 있다. 바로 fcntl.h와 unistd.h이다. 두 파일 모두 C POSIX 라이브러리 헤더 파일이다. C POSIX 라이브러리는 C 표준 라이브러리 POSIX에 대한 시스템 사양이다. ANSI C 의 표준으로 동시에 개발되어다. 두 헤더 모두 C POSIX 라이브러리 헤더 파일 중 하나이다. fcntl.h: 파일을 열고, 잠금 및 다른 작업을 할 수 있음 unistd.h: 다양한 필수 POSIX 함수와 상수 fcntl.h에 대해서 조금 더 살펴보면 파일 및 레코드 잠금을 구현하는 시스템 호출이라고 한다. 읽기 잠금을 통해 여러 프로세스가 공유 가능한 읽기 잠금 쓰기 잠금을 통해 한 프로세스만이 가질 수 있는 쓰기 잠금이 가능하다고 한다. op..

C & C++/C 2021.09.14

[C] void main(), int main(), main() 차이점

세 형태의 차이점에 대해 이야기해보고자 한다. 사실은 별 차이 없다고 한다. 간략하게 정리하자면 아래와 같다. 함수 정의 앞에 붙은 데이터 형은 함수의 리턴값의 데이터 형이고 int main()이면 main()함수가 종료할때 정수형 값을 리턴하겠다는 뜻이다. void main() 이면 함수가 종료할때 아무 값도 리턴하지 않겠다는 뜻이다. 그리고 그냥 main()은 void main()과 같다고 한다. main() 함수는 프로그램의 엔트리 포인트이고 운영체제가 실행시켜주는 함수라고 한다. 그래서 main() 함수의 리턴값은 운영체제가 받아보게 된다고 한다. 운영체제는 프로그램이 종료할때 main() 함수의 리턴값을 받고 이를 통해 프로그램이 왜 종료되었는지 판단한다고 한다. 보통 main()이 0을 리턴하..

C & C++/C 2021.07.03

[C++] 마이크로소프트 c++ 도큐먼트

c++ 관련해서 이것저것 검색하다가 마이크로소프트 c++ 머시기가 뜨길래 들어가보니 마소에서 제공하는 c++ 도큐먼트같은게 떴다. 살짝 훑어봤는데, 나름 잘 정리되있는 것 같더라. pdf로 다운도 받을 수 있어서 다운 받았는데, 번역도 잘 되있고, 꽤나 괜찮아 보인다... 내가원하는건 스레딩이었는데, 음... 안나와있다. 그래도 나름 괜찮은 자료이니 모셔서 저장하기... 언젠간 읽어볼 일이 생길듯. docs.microsoft.com/ko-kr/cpp/cpp/templates-cpp?view=msvc-160 템플릿 (C++) 자세한 정보: 템플릿 (c + +) docs.microsoft.com

C & C++/C++ 2021.04.19
반응형