Makrolar ile inline fonksiyonlar arasındaki fark nedir? Makroların klasik tuzakları nelerdir?

Cevap

Makrolar preprocessor tarafından metin olarak yerine konur; tip kontrolü, kapsam ve debug bilgisi yoktur. static inline fonksiyonlar ise gerçek fonksiyon semantiğine sahiptir ve optimizasyonla genelde aynı hızda kod üretir.

Tuzak 1: Parantez eksikliği

#define SQUARE(x) x * x
SQUARE(a + 1);          /* a + 1 * a + 1  →  yanlış */

#define SQUARE(x) ((x) * (x))   /* doğru */

Tuzak 2: Argümanın birden fazla değerlendirilmesi

#define MAX(a, b) ((a) > (b) ? (a) : (b))
MAX(i++, j);            /* i iki kez artabilir */
MAX(read_adc(), 100);   /* ADC iki kez okunur */

Tuzak 3: Çok satırlı makro ve if-else

#define RESET() led_off(); motor_off()
if (err) RESET();       /* motor_off() her zaman çalışır */

#define RESET() do { led_off(); motor_off(); } while (0)   /* doğru */

inline alternatifi

static inline int32_t max_i32(int32_t a, int32_t b) {
    return a > b ? a : b;
}
KriterMakrostatic inline
Tip güvenliğiYokVar
Yan etkilerTekrar değerlendirmeArgüman bir kez değerlendirilir
DebugAdım adım izlenemezBreakpoint konabilir
Inline garantisiHer zamanDerleyici kararı (always_inline ile zorlanabilir)
Generic kullanımHer tipe uyar_Generic gerekir

Makronun hâlâ gerekli olduğu yerler

  • Koşullu derleme: #ifdef DEBUG
  • Derleme zamanı sabitler ve register adresleri
  • __FILE__, __LINE__ kullanan log/assert makroları
  • Token birleştirme (##) ve stringize (#)
  • Statik dizi boyutu olarak kullanılan sabitler
  1. C dilinde volatile anahtar kelimesi ne işe yarar?OrtaC ProgramlamaEmbedded
  2. Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.KolayC ProgramlamaEmbedded
  3. Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?OrtaC ProgramlamaEmbedded
  4. Endianness nedir? Little-endian ile big-endian farkı nedir?KolayC ProgramlamaEmbedded
  5. Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?OrtaC ProgramlamaEmbedded
  6. Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.OrtaC ProgramlamaEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle