Bir müşteri Geçenlerde işveren C kod temeli statik analizini gerçekleştirdik ve bize sonuçları vermiştir. kullanışlı yamalar arasında do { ... } while(0,0)
ünlü do { ... } while(0)
makro değiştirme isteği oldu. Onların yama ne yaptığını ben (
dönüş
için sekans operatörünü kullanarak ikinci "0" değerine değerlendirmek, böylece etki aynıdır) anlıyorum ama onlar ilk form üzerinde ikinci bir form tercih ediyorum neden açık değil . C makrolarında, biri {...} tercihini yaparken (0,0), {...} iken (0)?
cevap
Eh, cevabını alacağız:
bir makro ikinci formu tercih etmeliyiz neden meşru bir sebep var mı ...?
sayılı meşru hiçbir sebep yoktur. Her ikisi de her zaman yanlış olarak değerlendirir ve herhangi bir iyi derleyici muhtemelen mecliste ikincisini birinciye çevirir. Bazı durumlarda geçersiz olması için herhangi bir sebep olsaydı, C bu sebepten ötürü yeterince uzun bir süre önce bu kadar büyük bir guru tarafından keşfedildi.
Kodunuzu baykuş-gözünüze yaklaştırmak isterseniz while(0,0)
. Aksi takdirde, C programlama dünyasının geri kalanının ne kullandığını kullanın ve müşterinizin statik analiz aracını kullanmasını söyleyin. onlar orada hiçbir davranış farkı olduğunu ve bu ikisi arasında hiçbir çalışma zamanı maliyet farkı olmalıdır olsa
do { ... } while(0,0)
do { ... } while(0)
üzerinde kullanarak önerebiliriz neden olarak
Sadece bir tahmin.
Tahminimce, statik analiz aracı while
döngüsünün basit durumda bir sabit tarafından kontrol edilmesinden şikayetçisidir ve 0,0
kullanıldığında bu yoktur. Müşterinin önerisi muhtemelen sadece aletten bir takım yanlış pozitifler almıyor.
Mesela ben bazen ben sürekli tarafından kontrol edilen bir koşullu deyimi olmasını istediğiniz durumlarda rastlamak, ancak derleyici bir sabite değerlendiren bir koşullu ifadede ilgili bir uyarı ile şikayet edecektir. Öyleyse derleyiciyi şikayet etmemek için bir çemberden atlamak zorundayım (çünkü sahte uyarılara sahip olmak istemiyorum).
Müşterinin önerisi, bu uyarıyı susturmak için kullandığım çemberlerden biridir, ancak benim durumumda bir while
döngüsünü kontrol etmiyordu, bir "her zaman başarısız" iddiasıyla uğraşmaktı. Bazen, asla yürütmemesi gereken bir kod alanına sahip olacağım (belki de bir anahtarın varsayılan durumu). En az bir derleyici ben ifade etmekle ilgili bir uyarı her zaman false olarak değerlendiren sorunları kullanın
assert(!"We should have never gotten here, dammit...");
Ama: Bu durumda ben her zaman bazı iletisiyle başarısız olur bir onaylama olabilir. Ancak, ben bunu değiştirin:
assert(("We should have never gotten here, dammit...", 0));
uyarı uzağa gider ve herkes mutlu. Müşterinizin statik analiz aracının da olabileceğini tahmin ediyorum.Sorunu çözmek için bir araç satıcısına söylemek mümkün olması güzel olabilir, ama aslında istiyorsun meşru durumlar da olabilir
#define ASSERT_FAIL(x) assert(((x), 0))
: Genellikle gibi bir makro arkasında çember atlama 'bu biraz gizlemek unutmayın Sabit bir boole ifadesi tarafından kontrol edilen bir döngüyü teşhis etmek. Böyle bir değişiklik yapmak için bir araç satıcısını ikna etseniz bile, gelecek yıl için size yardımcı olmamanın ya da bir düzeltmenin gerçekleşmesi için bu durumun söz konusu olabileceğinden bahsetmemek gerekir. süre (0,0) kullanarak,
+1 Bu olabilir, ancak bu durumda, bu uyarılar yalnızca komut satırı seçenekleriyle devre dışı bırakılmalıdır. Gerekli olmayan çemberleri kapatabildiğinizde neden çemberin içinden geçersiniz? –
Eh, bir, derleyici veya araç seçenekleri ile etrafta dolaşmak bir çember atlama şekli olarak düşünülebilir. Makefillerle ya da yaptıklarınızı kontrol eden her şey, C preprocessor korsanlığından çok daha fazla kara büyüdür (ve bu çok şey ifade ediyor). Bir başkası için, uyarının her şey için devre dışı bırakılmasını istemeyebilirsiniz - belki de bu aptal hilelere ihtiyaç duyan hata ayıklama makroları için. –
+1 Bu kabul edilen cevap olmalı. – Calmarius
(C4127 uyarı) sabit bir durum hakkında bir uyarı oluşturmak Microsoft derleyici engeller.
Bu uyarı etkinleştirildiğinde (ör./W4 veya/Wall ile), bu küçük küçük hile ile (see this other thread) duruma göre kapatılabilir.
Müşterinizin statik analiz aracı aşırı bir şey olmaktan çıktı, bu kesin. –
"Fazla aşırı gereksiz" için giderdim. –
Bunu yapmak için herhangi bir sebep düşünemiyorum. Belki de bir takım "bu asla olmayacak" satırları boyunca bir süre (0) durumuyla şikâyet eder fakat böyle bir araç 1) bunun, makrolarda C ile çok yaygın bir deyim olduğunu ve 2) do ... (0) ve iken (0) {}. Onlara mantık istedin mi? –