Birçok soruya gelince, bu sorunun cevabı bağlıdır . Hangisinin daha iyi olduğunu söylemek yerine, birinin diğerinden daha iyi olduğu örnekleri ve hedefleri verdim.
Hem önişlemci hem de sabitin kendi kullanım yerleri vardır.
Ön işlemci durumunda, kod derleme süresinden önce kaldırılır. Bu nedenle, kodun derlenmemesi beklenen durumlar için en uygun yöntemdir . Bu modül yapısını, bağımlılıkları etkileyebilir ve performans yönleri için en iyi kod segmentlerinin seçilmesine izin verebilir. Aşağıdaki durumlarda, kod yalnızca önişlemci kullanılarak bölünmelidir.
Çok platformlu kod:
Örneğin, kod farklı platformlar altında derlendiğinde, kodun belirli işletim sistemi sürüm numaralarına (veya derleyici sürümüne) bağımlı olması durumunda (bu çok nadir olsa da). Örneğin, küçük endien büyük endien kod muadilleriyle uğraşırken - sabitler yerine ön işlemcilerle ayrılmalıdır. Veya Windows için kod derliyorsanız Linux ve belirli sistem çağrıları çok farklıdır.
Deneysel Yamalar:
Bunun haklı gösterilmesinin bir başka örneği, riskli olan bazı deneysel kodlar veya atlanması gereken bazı önemli modüller ve önemli bağlantı veya performans farkı olacaktır. Birinin if () altında saklanmak yerine önişlemci aracılığıyla devre dışı bırakmak istemesinin nedeni , bu özel değişiklik kümesi tarafından tanıtılan hatalardan emin olamayacağımız ve deneysel olarak çalıştığımızdır. Başarısız olursa, bu kodu yeniden yazmaktan ziyade üretimde devre dışı bırakmaktan başka bir şey yapmamalıyız. Bir süre kodun tamamını yorumlamak için idealdir .#if 0
Bağımlılıklarla başa çıkmak: Oluşturmak
isteyebileceğiniz başka bir neden Örneğin, JPEG görüntülerini desteklemek istemiyorsanız, bu modülü / saplamayı derlemekten kurtulmanıza yardımcı olabilirsiniz ve sonunda kütüphane buna (statik veya dinamik olarak) bağlanmaz modülü. Bazen paketler ./configure
bu bağımlılığın kullanılabilirliğini belirlemek için çalışır ve kütüphaneler yoksa (veya kullanıcı etkinleştirmek istemiyorsa), bu tür bir işlevsellik bu kütüphaneye bağlanmadan otomatik olarak devre dışı bırakılır. Burada bu direktiflerin otomatik olarak oluşturulması her zaman faydalıdır.
Lisanslama:
Önişlemci direktifinin çok ilginç bir örneği ffmpeg'dir . Potansiyel olarak kullanımıyla patentleri ihlal edebilecek kodeklere sahiptir. Kaynağı indirir ve yüklemek için derlerseniz, bu tür şeyleri isteyip istemediğinizi sorar. Koşullar sizi mahkemeye götürebilirse, bazı durumlarda kodları gizli tutmak !
Kod kopyala-yapıştır:
Aka makroları. Bu makroların aşırı kullanımı için bir tavsiye değildir - sadece makroların geçmiş kopya eşdeğerini uygulamak için çok daha güçlü bir yolu vardır . Ancak büyük bir dikkatle kullanın; ve ne yaptığınızı biliyorsanız kullanın. Sabitler elbette bunu yapamazlar. Ama inline
eğer kolaysa fonksiyonlar da kullanılabilir .
Peki sabitleri ne zaman kullanıyorsunuz?
Neredeyse her yerde.
Daha temiz kod akışı:
Genel olarak, sabitleri kullandığınızda, normal değişkenlerden neredeyse ayırt edilemez ve bu nedenle daha iyi okunabilir koddur. Eğer #ifdef ile her 10 satır sonra 3 veya 4 hatları var Lines 75 olan rutin yazarsanız okunması ÇOK yapamaz . Muhtemelen #ifdef tarafından yönetilen bir birincil sabit verildi ve onu her yerde doğal bir akışta kullanın.
İyi girintili kod: Tüm önişlemci yönergesi, başka şekilde iyi girintili kodla asla iyi çalışmaz . Bile senin derleyici #def girintilemesini izin vermez, Ön ANSI C önişlemci bir çizgi ve "#" karakteri başlangıcı arasındaki alanı için izin vermedi; baştaki "#" her zaman ilk sütuna yerleştirilmelidir.
Konfigürasyon:
Sabitlerin / veya değişkenlerin anlamlı olmasının bir başka nedeni, bunların globallere bağlanmaktan veya gelecekte konfigürasyon dosyalarından türetilecek şekilde genişletilebileceğidir.
Son bir şey:
Hiç KULLANIMI önişlemci direktifleri #ifdef
ile #endif
kapsamını geçerken ya { ... }
. yani farklı taraflarının başlangıcı #ifdef
veya sonu . Bu son derece kötü; kafa karıştırıcı olabilir, bazen tehlikeli olabilir.#endif
{ ... }
Bu elbette, kapsamlı bir liste değildir, ancak hangi yöntemin kullanılmaya daha uygun olduğu konusunda size kesin bir fark gösterir. Bu ilgili değil Hangisi daha iyi yerine her zaman daha fazladır arasında, hangisinin daha doğal verilen bağlamda kullanmak.