[C, C++] 크기가 0인 배열의 사용 이유 (flexible array member)

크기가 0인 배열 크기가 0인 배열을 멤버로 가지는 구조체를 목격했다. arr[0]이 실제로 0의 크기를 갖는지 확인하기 위해 sizeof로 출력해봤더니 0이 맞다. 어디에 쓰는지 몰라서 인터넷을 뒤졌다. 검색 키워드 크기가 0인 배열은 인터넷에 아래의 키워드들로 검색할 수 있다. 이 글은 크기가 0인 배열을 간략히만 소개할 것이므로 자세한 내용은 위 키워드들로 검색이 필요하다. 크기가 0인 배열의 사용 … Read more

[C, C++] 가변인자를 가지는 매크로(define) 구현

가변인자만을 가지는 매크로 구현 테스트환경 : Windows10 / Visual Studio Code / gcc 6.3.0 함수에 가변인자를 사용할 수 있듯이 매크로에도 가변인자를 사용할 수 있다. [C, C++] 가변인자를 가지는 함수 구현 가변인자만을 가질 때와 가변인자와 고정인자를 같이 가질 때 매크로 구현법이 다른데, 먼저 가변인자만을 가지는 매크로 구현은 아래와 같다. (…)는 가변인자임을 표시하며 __VA_ARGS__는 가변인자를 입력받는다. 가변인자와 … Read more

[C, C++] 매크로(define) 여러줄로 정의

다른 글 [C, C++] 가변인자를 가지는 매크로(define) 구현 매크로 여러줄 정의 방법 매크로는 기본적으로 #define 뒤에 따라오는 한줄만 정의한다. 그러나 여러 줄을 하나의 매크로에 정의해야 할 일이 생길 수도 있다. 그럴때는 가장 뒤에 역슬래시()만 입력하면 된다. 구현 테스트환경 : Windows10 / Visual Studio Code / gcc 6.3.0 라인 가장 뒤에 역슬래시를 입력하고 그 다음줄에 계속 … Read more

[C, C++] 가변인자를 가지는 함수 구현

서론 우리는 printf 함수 사용시 출력하고 싶은 내용이 하나씩 늘어날 때마다 인자를 하나씩 늘려나간다. 이처럼 인자의 개수를 마음대로 조절하여 사용할 수 있는 함수를 구현한다. 가변인자를 가지는 함수 구현 전체 코드 코드 해석 가변인자를 사용하기 위해서는 stdarg.h가 필요하다. 이 헤더파일에는 va_start, va_end, va_arg, va_copy가 정의되어 있다. 이 중 va_start, va_end, va_arg를 사용한다. 가변인자를 가지는 함수를 만들기 … Read more

[C, C++] size_t, time_t 등에서 _t의 뜻

clock_t C언어에는 시간을 측정하는 clock함수가 있다. 그리고 이 함수는 리턴값으로 clock_t의 자료형을 받는다. clock_t 뿐 아니라 size_t, time_t 등 _t가 쓰여진 자료형들을 어렵지 않게 만날 수 있다. _t t는 type의 약자로, typedef로 정의된것을 의미한다. C언어의 stdint.h 파일을 보면 이를 확인할 수 있다. _t는 typedef로 이름을 새롭게 정의한 것일 뿐 컴파일러를 위한 표현이 아닌 사람의 가독성을 … Read more

[C, C++] 함수포인터와 콜백함수

이 글은 포인터의 개념을 알고 있다는 가정 하에 작성되었습니다. 서론 함수포인터는 입사 후 외부업체의 API를 사용하면서 처음 접했다. 함수포인터를 학습하다 보니 콜백함수가 등장했고, 콜백함수를 학습하다 보니 API에 함수포인터가 왜 사용되는지 알게 되었다. 알고 보니 API에 흔하게 사용되었다. 함수포인터 포인터는 변수의 주소값을 가진다. 그리고 함수포인터는 함수의 주소값을 가진다. 주체만 다를 뿐이지 주소를 저장한다는 포인터의 본래 목적은 … Read more

[C, C++] int const, const int, int const *, int * const

const(상수) 변수와 달리 const는 한번 만들어진 자료를 수정할 수 없게 상수로 만든다. C, C++외 다른 언어에서는 const외 readonly, final과 같은 유사한것들도 있다. int const, const int const는 위치가 가변적이며 int const는 const int와 같다. 편하게 int를 썼을 뿐 특정 자료형과 관련이 있지는 않다. char const, const char도 마찬가지다. int const *, int * const 포인터 … Read more

[C, C++] 시간측정 함수 clock

clock 함수 프로그램이 실행되면 0부터 1ms당 1씩 clock이 계속 증가하고 있으며, clock()을 호출할 때 현재 clock(현재까지 증가된 clock)을 얻어올 수 있다. 즉 clock()으로 호출된 결과는 호출된 시점에서의 프로그램 실행시간이다. 이를 이용해서 특정 구간 시작과 끝 clock의 차이를 얻어오면 그 구간의 실행시간을 측정할 수 있다. RTOS/임베디드 시스템에서의 clock 함수 RTOS에서는 clock 함수 사용시 주의가 필요하다. 하드웨어와 … Read more

[C, C++] #ifdef, #if defined() 활용

소프트웨어가 업데이트될 때, 당장 사용하지 않지만 언제 재사용될지 몰라서 남겨둬야 하는 코드들이 있거나, 하나의 소스코드를 국가마다 언어를 다르게 하고싶다거나 할때 이런 경우 #if, #if defined와 같은 전처리기가 유용하게 활용된다. 클린코드인가 어디선가 사용하지 않는 코드나 주석은 남기지 말고 지우라지만 안쓰기가 쉽지않다. 그런데 확실히 ifdef가 많으면 코드가 지저분해지는건 어쩔수가 없다. #ifdef #ifdef는 #define으로 정의된 매크로와 함께 쓰이는데, … Read more

[C, C++] 전역변수와 정적변수가 0으로 초기화되는 이유

전역변수(global), 정적변수(static), 지역변수(local) 초기화를 하지 않은 전역변수, 정적변수, 지역변수를 선언하고 출력해보았다. 위 코드를 실행하면 아래와 같은 출력을 얻는다. 따로 초기화를 하지 않았지만 전역변수(global)와 정적변수(static)는 자동으로 0으로 초기화되었고 지역변수(local)는 초기화를 하지 않아서 쓰레기 값이 들어갔다. 이는 변수의 저장 위치가 다르기 때문에 발생하는 결과다. Data, BSS, Stack 지역변수는 메모리의 Stack Segment에 저장되며 선언된 함수가 종료되면 메모리에서 사라진다. … Read more