Üstbilgideki Makro ve Statik işlevler


9

birinin bir işlevi kullanabileceği birçok hızlı görev için f(x,y), düz C'de makrolar kullanılır. Özellikle bir işlev çağrısı (yani rasgele kod kod genişletme için değil, satır içi işlevler için kullanılan makrolar) tarafından çözülebilir olan bu durumlar hakkında sormak istiyorum.

Diğer C dosyalarından bağlandıkları için genellikle C işlevleri satır içine alınmaz. Ancak, statik C işlevleri yalnızca tanımlandıkları C dosyasından görülebilir. Bu nedenle derleyiciler tarafından satır içine alınabilirler. Daha fazla kodun statik işlevlere dönüştürülerek değiştirilmesi gerektiğini duydum, çünkü bu daha güvenli bir kod üretiyor.

Bunun iyi bir fikir olmadığı durumlar var mı?

Yine: ## benzer yapılara sahip Kod Üretimi makrolarını hiç bir şekilde ifade edemeyen sorular sormamak.


4
Sorunuzun burada yanıtlanmış olabileceğini düşünüyorum stackoverflow.com/questions/9104568/macro-vs-function-in-c ve burada stackoverflow.com/questions/1358232/why-use-macros-in-c
Maru

uygun bir makro yazmak bir acıdır ve inlineişlevler sadece ikili dosyada birden çok kez tanımlanabilmesini sağlar, derleyici aslında yerden tasarruf etmek için satır içi olup olmayacağına karar verebilir
cırcır ucube

2
Aslında bunların çoğunun tarihsel nedenler olduğundan şüphelenirim. Yıllar önce, C derleyicileri hiçbir şekilde satır içi işlevler yapmadı. Böylece insanlar satır içinde istedikleri şeyler için makrolar kullandılar. C kodu genellikle olağandışı uzun ömürlüdür.
Jan Hudec

@ratchetfreak: C yok inline, bu C ++ ile ilgili değil.
wirrbel

2
@wirrbel Elbette inlineC'de, en azından C99'dan beri. Hızlı bir genel bakış için satıriçi işlevler hakkında Wikipedia'ya bakın .
amon

Yanıtlar:


6

Bir işlev çağrısı tarafından çözülebilen makroların birçok tuzağı vardır:

  • Bunları yazmak zordur, çünkü gibi argümanları doğru bir şekilde ele almanız gerekebilir ++i.
  • Görsel bir hata ayıklayıcıyla hata ayıklamak zordur, çünkü bir makrodan geçemez veya oraya bir kesme noktası koyamazsınız.
  • Derleme bağımlılıklarını analiz ederken doğru şekilde işlemek zordur.

Bir işlev çağrısı tarafından çözülebilen makrolar, ilkel bir derleyicide satır içi sağlamada yararlı olabilirdi. Herhangi bir derleyicinin satır içi işlevlerini işlemediğinin farkında değilim ve hatta bazıları derleme birimleri arasında satır içi olabilir.

Diğer C dosyalarından bağlandıkları için genellikle C işlevleri satır içine alınmaz.

Bir derleyicinin geleneksel bir called ve inlined bir işlevi olmak üzere bir işlevin iki sürümünü sağlayamaması için hiçbir neden yoktur . Hedeflediğiniz derleyicinin belgelerine bakmalısınız. Ayrıca, oluşturulan montajı incelemek isteyebilirsiniz: montajı bilmeseniz bile, bazı fonksiyonların inline olup olmadığını hızlıca öğrenebilirsiniz. (Bunu hızlı bir şekilde öğrenmek için bebek örnekleriyle başlayın.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.