Özet - Modern C
- C kursu
- Uzman
- Ders 30/47
- 5 dk
_Generic, _Static_assert ve atomics'i birleştirerek tip güvenli bir makro yazarsın.
Özet - Modern C birleşimi
Bu derste _Generic, _Static_assert ve atomik işlemleri birleştirerek tip güvenli bir makro yazacaksın. safe_print makrosu, _Generic ile tipi seçer; _Static_assert ile int boyutunu doğrular; atomic_int sayaç ile çağrı sayısını tutar.
Bu üç özellik birlikte, modern C'nin gücünü gösterir: derleme zamanı güvenliği, tip tabanlı seçim ve iş parçacığı güvenli sayaç. Önceki derslerin çözümlerini birleştirip tek bir program yazacaksın. Program, her çağrıda tip adını yazdırır ve sayacı bir artırır; en son sayaç değerini yazdırır.
Uygulama safe_print makrosunu yaz
#include <stdatomic.h> ekle. _Static_assert(sizeof(int) >= 4, "int en az 4 bayt"); yaz. static atomic_int call_count = 0; tanımla. #define safe_print(x) makrosunu yaz: _Generic((x), int: "int", double: "double", default: "diğer") ile tipi seç, printf("%s\n", ...) ile yazdır, sonra atomic_fetch_add(&call_count, 1) ile sayacı artır. int main(void) içinde safe_print(42) ve safe_print(3.14) çağır, en son printf("%d\n", call_count) yazdır.
Başlangıç kodu
#include <stdio.h>
#include <stdatomic.h>
// derleme denetimi ekle
// atomik sayaç tanımla
// safe_print makrosunu yaz
// main'de çağır ve sayacı yazdırÖrnek çözüm
#include <stdio.h>
#include <stdatomic.h>
_Static_assert(sizeof(int) >= 4, "int en az 4 bayt");
static atomic_int call_count = 0;
#define safe_print(x) printf("%s\n", _Generic((x), int: "int", double: "double", default: "diğer")); atomic_fetch_add(&call_count, 1)
int main(void) {
safe_print(42);
safe_print(3.14);
printf("%d\n", call_count);
return 0;
}Beklenen çıktı
int double 2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 safe_print hangi üç özelliği birleştirir?
- malloc, free, realloc
- _Generic, _Static_assert, atomics Doğru cevap
- printf, scanf, fprintf
- fork, exec, wait
Açıklama: safe_print, _Generic + _Static_assert + atomics birleşimidir.
2 Atomik artış çağrısını tamamla
static atomic_int call_count = 0;
____(&call_count, 1);
static atomic_int call_count = 0;
atomic_fetch_add(&call_count, 1);
Açıklama: atomic_fetch_add(&call_count, 1) sayacı atomik artırır.
3 Özelliği görevine eşle
| Kavram | Anlamı |
|---|---|
_Generic |
Tip seçimi |
_Static_assert |
Derleme denetimi |
atomic_int |
Atomik sayaç |
printf |
Çıktı yazma |