이번 글에서는 C/C++에서 어설션(assertion)이 무엇인지 자세히 알아보겠습니다. 어설션은 프로그램 개발 과정에서 특정 조건이 반드시 참(true)이라고 가정되는 지점을 검증하는 데 사용되는 강력한 디버깅 도구입니다.어설션이란?C 표준 라이브러리에서 제공하는 매크로인 void assert(int expression)은 진단(diagnostic) 정보를 표준 에러 스트림(stderr)에 출력할 수 있도록 해줍니다. 쉽게 말해, C 프로그램에 진단 기능을 손쉽게 추가할 수 있는 도구라고 할 수 있습니다.assert() 매크로의
이번 글에서는 C 언어의 fork() 시스템 콜에 대해 자세히 알아보겠습니다. fork()는 새로운 프로세스를 생성하는 데 사용되는 시스템 콜로, 새로 만들어진 프로세스를 자식 프로세스(child process)라고 부릅니다. 반면, 자식 프로세스를 생성한 현재 프로세스는 부모 프로세스(parent process)라고 합니다.자식 프로세스는 부모 프로세스가 사용하던 프로그램 카운터(program counter), CPU 레지스터, 그리고 열려 있던 파일들을 그대로 물려받아 사용합니다. 즉, fork() 호출 시점에 부모 프로세스의
lvalue와 rvalue란?C 언어에서 모든 표현식(expression)은 lvalue 또는 rvalue 중 하나로 분류됩니다. 이 두 개념을 정확히 이해하면 대입 연산과 관련된 컴파일 오류의 원인을 쉽게 파악할 수 있습니다.lvalue(locator value)는 메모리상에서 식별 가능한 위치, 즉 주소를 가지는 객체를 의미합니다. 반면 rvalue는 배제적으로 정의되는데, 메모리에서 식별 가능한 위치를 차지하지 않는 표현식을 뜻합니다.대입 연산과 lvalue대입 연산자(=)는 왼쪽 피연산자로 반드시 lvalue를 요구합니다.
이 글에서는 C/C++ 프로그램에서 SQLite를 사용하는 방법을 단계별로 알아봅니다. 라이브러리 설치부터 데이터베이스 연결, 테이블 생성, 데이터 삽입과 조회까지 실제 예제 코드와 함께 살펴보겠습니다.설치C/C++ 프로그램에서 SQLite를 사용하기 전에 먼저 개발 환경에 SQLite 라이브러리가 설치되어 있는지 확인해야 합니다. 설치 과정에 대한 자세한 내용은 SQLite 설치 관련 문서를 참고하시기 바랍니다. 리눅스 환경에서는 대부분의 배포판에서 sqlite3 패키지와 개발용 헤더 파일(libsqlite3-dev 등)을 패키지
이번 글에서는 C/C++ 단일 프로그램 안에서 좀비 프로세스(zombie process)와 고아 프로세스(orphan process)를 동시에 실행하는 방법을 알아보겠습니다. 본격적인 설명에 앞서, 두 프로세스가 각각 어떤 것인지 먼저 살펴보겠습니다.좀비 프로세스(Zombie Process)좀비 프로세스는 실행이 이미 종료되었지만 여전히 프로세스 테이블에 항목이 남아 있는 프로세스를 말합니다. 좀비 프로세스는 주로 자식 프로세스에서 발생하는데, 그 이유는 부모 프로세스가 자식의 종료 상태(exit status)를 아직 읽지 않았기
이 글에서는 C/C++ 프로그램에서 SQLite를 사용하는 방법을 단계별로 살펴봅니다. 라이브러리 설치부터 주요 인터페이스 API, 그리고 데이터베이스 연결, 테이블 생성, 데이터 삽입과 조회까지 실제 동작하는 예제 코드와 함께 자세히 설명합니다.설치C/C++ 프로그램에서 SQLite를 사용하기 전에, 먼저 개발 환경에 SQLite 라이브러리가 올바르게 설정되어 있는지 확인해야 합니다. 설치 과정에 대한 자세한 내용은 SQLite 공식 문서의 설치(Installation) 챕터를 참고하시기 바랍니다. 대부분의 리눅스 배포판에서는 a
C/C++에서는 실제 숫자 앞에 0을 붙이는 것만으로 8진수(octal) 리터럴을 표현할 수 있습니다. 예를 들어, 8진수 25를 나타내고 싶다면 025처럼 작성하면 됩니다.8진수의 기본 개념8진수는 각 자릿수가 8의 거듭제곱을 나타내는 진법입니다. 따라서 8진수 025는 10진수로 2×8 + 5 = 21이 되고, 8진수 063은 6×8 + 3 = 51이 됩니다.예제 코드#include <stdio.h> int main() { int a = 025; int b = 063; printf(Decimal
C 언어에서 스레드 속성(pthread attribute)의 스택 크기를 확인하거나 변경하려면 POSIX 스레드(pthread) 라이브러리가 제공하는 pthread_attr_getstacksize() 함수와 pthread_attr_setstacksize() 함수를 사용합니다. 이 글에서는 두 함수의 사용법과 동작 방식을 예제 코드와 함께 살펴보겠습니다. pthread_attr_getstacksize() – 현재 스택 크기 가져오기 이 함수는 스레드 속성 객체에 설정된 스택 크기를 조회하는 데 사용됩니다. 여기서 stacksize
C 프로그래밍 언어에서 동적 메모리 할당(Dynamic Memory Allocation)은 프로그램 실행 도중 필요한 만큼 메모리를 유연하게 확보하고 해제할 수 있는 기능입니다. 배열처럼 컴파일 시점에 크기를 고정하지 않고, 런타임에 상황에 맞게 메모리를 관리할 수 있어 효율적인 프로그램 작성에 필수적인 개념입니다. C 언어는 메모리 할당과 관리를 위한 여러 표준 함수를 제공하며, 이 함수들은 <stdlib.h> 헤더 파일에 선언되어 있습니다. 동적 메모리 할당 주요 함수 함수설명 void *calloc(int n
이 글에서는 C 언어에서 fork() 함수를 사용하여 자식 프로세스를 생성하는 방법을 알아봅니다. 또한 부모 프로세스와 자식 프로세스가 각각 서로 다른 작업을 수행하도록 만드는 방법도 함께 살펴보겠습니다.fork()의 동작 원리fork()가 호출되면 새로운 프로세스가 생성되며, 이때 반환값을 통해 현재 실행 중인 프로세스가 부모인지 자식인지 구분할 수 있습니다.반환값이 0보다 크면 → 현재 코드는 부모 프로세스에서 실행 중입니다. 이 경우 반환값은 자식 프로세스의 PID(프로세스 ID)입니다.반환값이 0이면 → 현재 코드는 자식 프
C 프로그래밍에서 함수 프로토타입(function prototype)은 왜 사용해야 할까요? 함수 프로토타입은 컴파일러에게 함수가 받는 인자의 개수와 각 매개변수의 자료형, 그리고 함수의 반환 타입을 미리 알려주는 역할을 합니다. 컴파일러는 이 정보를 바탕으로 함수를 호출하기 전에 함수 시그니처(함수 이름, 매개변수 목록, 반환 타입)가 올바른지 교차 검증할 수 있습니다.만약 함수 프로토타입을 선언하지 않으면, 프로그램이 경고(warning)와 함께 컴파일되거나 경우에 따라 예상치 못한 이상한 출력 결과를 만들어낼 수도 있습니다.프
C 프로그래밍에서 main() 함수가 실행되기 전과 후에 특정 함수를 자동으로 호출해야 하는 경우가 있습니다. 예를 들어 프로그램 시작 전에 초기화 작업을 수행하거나, 종료 후에 리소스 정리(clean-up) 작업을 처리할 때 유용합니다.이를 구현하려면 GCC에서 제공하는 __attribute__ 기능을 활용하면 됩니다. 두 가지 속성이 사용됩니다.constructor: main() 함수가 실행되기 이전에 해당 함수가 호출됩니다.destructor: main() 함수가 종료된 이후에 해당 함수가 호출됩니다.예제 코드#include&
개요 C 언어는 줄임표(...) 문법을 통해 함수가 미리 정해지지 않은 개수의 인자를 전달받을 수 있도록 지원합니다. 이를 가변 인자(variable arguments)라고 합니다. 다만 가변 인자에는 그 개수에 대한 정보가 자동으로 포함되지 않기 때문에, 프로그래머가 직접 개수를 파악할 수 있는 장치를 마련해야 합니다. 일반적으로 다음 세 가지 방법 중 하나를 사용합니다. 첫 번째 인자로 개수 전달: 함수 호출 시 인자의 총 개수를 첫 번째 매개변수로 넘깁니다. 마지막 인자로 NULL 전달: 인자 목록의 끝을 표시하는 센티널(s
프로그래밍을 하다 보면 하나의 함수에 여러 개의 인자를 전달하는 경우가 많습니다. 이때 자연스럽게 떠오르는 의문이 하나 있습니다. 과연 함수 매개변수는 어떤 순서로 평가될까요? 왼쪽에서 오른쪽으로 평가될까요, 아니면 오른쪽에서 왼쪽으로 평가될까요?평가 순서를 확인하는 가장 확실한 방법은 간단한 테스트 프로그램을 직접 작성해 보는 것입니다. 아래 예제에서는 증가 연산이 포함된 여러 인자를 전달하고, 출력 결과를 통해 실제 평가 순서를 확인할 수 있습니다.예제 코드#include<stdio.h>void test_functio
C나 C++에서는 함수가 return 문을 통해 여러 개의 값을 직접 반환할 수 없습니다. 하지만 몇 가지 트릭을 활용하면 하나의 함수에서 두 개 이상의 결과값을 얻어낼 수 있습니다.포인터(주소 전달)를 이용한 방법가장 대표적인 방법은 주소에 의한 호출(Call by Address) 또는 참조에 의한 호출(Call by Reference) 방식입니다. 호출자(caller) 쪽에서는 결과를 저장할 변수를 미리 준비해 두고, 함수는 포인터 타입의 매개변수를 받도록 선언합니다. 그러면 함수 내부에서 해당 주소를 통해 원본 변수에 직접 값
함수 프로토타입(Function Prototype)이란?이 글에서는 C 또는 C++에서 함수 프로토타입을 사용하는 목적에 대해 알아보겠습니다. 함수 프로토타입은 컴파일러에게 함수가 받는 인자의 개수, 각 매개변수의 자료형, 그리고 함수의 반환 타입을 미리 알려주는 역할을 합니다.컴파일러는 이 정보를 바탕으로 함수를 실제로 호출하기 전에 함수 시그니처(function signature)를 교차 검증하여 타입 불일치나 잘못된 호출 여부를 확인합니다. 만약 함수 프로토타입이 선언되어 있지 않으면, 프로그램은 경고(warning)와 함께
C 언어에서 함수 원형(프로토타입)을 선언하지 않은 상태에서, 함수의 본문이 해당 함수의 호출문보다 뒤쪽에 위치해 있다면 어떤 일이 발생할까요? 이런 경우 컴파일러는 함수의 반환형을 기본값인 정수(int)로 암묵적으로 간주합니다.따라서 함수가 int가 아닌 다른 자료형의 값을 반환하도록 정의되어 있다면 컴파일 오류가 발생합니다. 반대로 반환형이 정수라면 프로그램은 정상적으로 동작하지만, 컴파일러 설정에 따라 경고 메시지가 출력될 수 있습니다.예제 코드 1 — char 반환형의 경우#include<stdio.h>main()
_Noreturn 함수 지정자란?C11 표준에서 도입된 _Noreturn 함수 지정자는 컴파일러에게 해당 함수가 실행된 후 호출자에게 제어권을 다시 반환하지 않는다는 사실을 알려주는 키워드입니다. 대표적으로 exit()나 abort()처럼 프로그램을 강제로 종료하는 함수들이 이에 해당합니다.만약 _Noreturn으로 선언된 함수 내부에 return 문이 존재하면, 컴파일러는 컴파일 시점에 경고나 오류를 발생시킵니다.잘못된 사용 예제#include<stdio.h>_Noreturn char function() { &
콜백(callback)은 기본적으로 다른 코드에 인수(argument) 형태로 전달되는 실행 가능한 코드를 의미하며, 특정 시점에 해당 인수를 다시 호출하거나 실행하는 것이 기대됩니다. 조금 다른 관점에서 설명하면, 어떤 함수의 참조(주소)가 호출 목적으로 다른 함수의 매개변수에 전달될 때, 그 함수를 콜백 함수라고 부릅니다. C에서 콜백 함수는 어떻게 구현할까? C 언어에는 자바스크립트나 파이썬처럼 함수를 일급 객체(first-class object)로 직접 전달하는 문법이 없습니다. 대신 함수 포인터(function pointe
C 프로그램은 실행될 때 명령줄(command line)에서 값을 전달받을 수 있습니다. 이렇게 전달되는 값들을 명령줄 인수(command line arguments)라고 부르며, 프로그램 내부에 값을 하드코딩하는 대신 외부에서 프로그램의 동작을 제어하고 싶을 때 매우 유용하게 활용됩니다.명령줄 인수는 main() 함수의 매개변수를 통해 처리됩니다. 여기서 argc는 전달된 인수의 개수를 나타내고, argv[]는 프로그램에 전달된 각각의 인수를 가리키는 포인터 배열입니다.다음은 명령줄에서 인수가 전달되었는지 확인하고, 그 결과에 따