Rust 프로그래머를 위한 C

3 hours ago 3

Rust에 익숙한 개발자가 C를 배울 때는 타입 시스템과 컴파일러가 강제하지 않는 책임을 직접 챙겨야 함. 오류 처리, 문자열 종료, 포인터와 메모리 접근이 대표적임 C 문자열은 길이를 별도로 저장하는 대신 널 종료 바이트 \0 를 사용하므로, 공간을 한 바이트 더 확보하고 종료 문자를 넣어야 함 C의 기본 정수형은 대상 플랫폼에 따라 폭이 달라지므로, 크로스 플랫폼 호환성이 중요하다면 <stdint.h>의 고정 폭 정수형 사용을 권장함 배열을 함수에 전달하면 첫 요소를 가리키는 포인터로 변환됨. 함수 매개변수에 배열 크기를 적어도 sizeof는 배열이 아닌 포인터 크기를 반환함 C에는 대여 검사나 Rust식 참조가 없으며, 메모리 접근 실수는 버퍼 오버플로와 범위 밖 쓰기로 이어질 수 있음. 시스템 프로그래머에게 중요한 언어지만 안전성을 직접 관리해야 함 Rust에서 C로 넘어갈 때의 학습 범위 Rust를 먼저 배운 개발자를 위한 C의 의외의 동작과 주의점을 모은 자료이며, 정식 C 튜토리얼을 대체하지 않음 C++는 범위에서 제외하고, Rust와 비교했을 때 주의해야 할 C의 타입, 문자열, 오류 처리, 배열과 포인터 동작에 집중함 불리언과 C 표준 버전 초기 C에는 불리언 기본 타입이 없어 정수 0과 1을 사용했으며, C99부터 <stdbool.h>를 포함해 bool, true, false를 사용할 수 있게 됨 _Bool은 헤더 없이도 사용할 수 있지만, true와 false 정의에는 헤더가 필요함 이때 true와 false는 리터럴이나 키워드가 아니라 각각 1, 0으로 확장되는 매크로임 C23에서는 불리언이 언어 자체의 기본 요소가 됨 이전 표준으로 컴파일한다면 <stdbool.h>가 필요함 Clang의 C23 지원은 아직 부분적이므로 헤더를 제거하기 전 지원 상태를 확인해야 함 널 종료 문자열과 길이 저장의 절충 Rust의 &str은 주소와 길이를 함께 보관함. 예제에서는 주소 8바이트와 길이 8바이트로 총 16바이트이며, 일반 &u8 참조는 8바이트임 str은 동적 크기 타입이므로 포인터 메타데이터로 길이를 추적함 길이를 빠르게 얻는 대신 참조당 메모리를 더 사용하며, Rust의 언어 기능 덕분에 주소와 길이를 별도 변수처럼 관리할 필요는 없음 C는 길이를 따로 저장하지 않고 문자열 끝에 널 바이트 \0 를 둠 문자열과 함께 별도의 크기 변수를 유지할 필요...

Read Entire Article