반응형

c 5

[C11] C언어 표준 스레드 실행

C11에 들어서면서 C언어도 정식으로 스레드를 지원하기 시작했습니다. #include 만 해 주시면 모든 준비가 끝납니다. #include #include #include int func() { thrd_sleep(&(struct timespec){.tv_sec=3}, NULL); puts("func()"); } int main() { thrd_t thread; // 스레드 타입 변수 int result; // 결과값 thrd_create(&thread, func, NULL); thrd_join(thread, &result); printf("result: %d", result); } 간단합니다. C++에서처럼 thrd_t 변수를 선언하고, thrd_create를 통해 스레드를 생성합니다. int thrd..

[C99] Compound Literals, C에서의 이름없는 임시 객체

C++11에서 이름없는 임시 객체 (그리고 이동시맨틱) 때문에 머리가 많이 터졌었죠. 그런데 C에서 비슷한 느낌의 Compound Literals라는 걸 만들었습니다. "한 번만 쓰고 버리는" 변수인데, 배열/구조체/공용체 등에서 사용 가능합니다. 이름없는 임시객체와 비슷한 느낌입니다. (타입){초기화 리스트} 이렇게 사용합니다. 타입에는 배열/구조체/공용체가, 초기화 리스트는 일반 배열 사용하듯이 쓰면 됩니다. C++에서 int(5)이렇게 작성하면 5가 담긴 int형 임시 객체를 생성하는 것 처럼 이것도 마찬가지입니다. (int[]){1, 2, 3, 4, 5} 라고 쓰면 1, 2, 3, 4, 5가 담긴 int형 배열을 만들어냅니다. ​ C++에서는 클래스를 만들고 함수를 호출할 때 이동 시맨틱을 통해 ..

[C99] 포인터 최적화를 위한 restrict 키워드

이 키워드가 추가됨에 따라 , 에서도 알 수 있듯 대부분의 표준 라이브러리 함수들에 restrict가 붙었습니다. 최적화 키워드 중 하나인데, restrict을 쓰면 그 포인터가 가르키는 객체는 다른 포인터가 가르키지 않는다는 것을 나타냅니다. 주로 함수의 매개변수로 쓸 텐데, 예시를 보시죠. #include int int_swap(int* restrict p1, int* restrict p2) { if (p1 == p2) return EOF; int temp = *p1; *p1 = *p2; *p2 = temp; return 0; } int main() { int a = 10, b = 5; printf("a = %d, b = %d\n", a, b); int_swap(&a, &b); printf("a = ..

[C11] 컴파일 타임 오류내기, static_assert

assert() 자주 사용하시나요? 프로그램에서 런타임 오류를 잡아내고 예외를 처리하는데 쓰이죠. ​ 하지만 컴파일 타임에 예외가 있으면 컴파일이 안 되게 만드는, 정적 어설션은 이보다 더 유용할 때가 많습니다. C++에서 static_assert() 키워드를 도입했듯이, C언어에서도 static_assert()를 지원합니다. ​ 물론 C++처럼 네이티브로 지원하는 것은 아니고, 헤더를 하나 포함하거나 살짝 다른 예약어를 사용해야 합니다. _Static_assert(식, 문자열) (C11 예약어) _Static_assert(식) (C2x) #include // 를 하면 static_assert(식, 문자열) // 이렇게 작성해도 됩니다. #include int main() { static_assert(1..

[C99] C언어에서 표준 bool 타입 사용하기

흔히 Boolean 타입은 0과 1만 담을 수 있는, 참/거짓을 판별하는 자료형으로 많이 쓰입니다. C언어에서는 bool 타입이 없어 int를 대신 사용하죠. ​ 그런데 C99....어..그러니까.. 20년 전에 이미 bool타입은 추가되었습니다. 다만 bool이라고 그대로 쓰면 오류가 납니다. 꽤나 나중에 추가된 것이라 그런지 기존 코드에서 호환성을 유지하기 위해서인진 모르겠지만 사용법은 일단 다음과 같습니다. _Bool boolean = 1; 타입 이름은 _Bool입니다. 밑줄 + 대문자는 표준에서만 사용하는 거 아시죠? 그래서 이런 형태로 추가가 됐나 봅니다. 대입은 int형 정수 0, 1을 사용합니다. ​ 하지만 계속 _Bool을 저렇게 안 예쁘게 쓸 수는 없습니다. 그래서 새로운 헤더 파일이 등..

반응형