2013-04-12 13 views
9

Şirket politikası, C kaynak kodundaki her işlevin bir prototipe sahip olduğunu belirtir. Kendi make sistemi ile bir proje miras aldım (bu yüzden ,'u gcc veya Visual Studio'da test edemez) ve dosyalardan birinin prototip olmadan bildirilen bazı statik işlevlere sahip olduğunu buldum. Tüm .c dosyalarında prototip olmadan tüm fonksiyonları listelemenin bir yolu var mı? Derleme ve kuvvet insanları durdurmak için bir hata içine bu uyarıyı açabilirsiniz Bir prototip olmadan C fonksiyonları nasıl bulunur?

gcc -Wmissing-prototypes 

bunu düzeltmek için:

gcc -Werror=missing-prototypes 

sadece istiyorsanız

+2

statik fonksiyonlar gerçekten prototip gerekmez –

+0

@ Paul: Evet, ama çabuk fonksiyonları – Gnubie

+1

Eğer vb mevcuttur ne olduğunu görmek için proje yöneticisinin verir herhalde Başka bir derleyici kullanamazsınız, bilinmeyen nedenlerle, ayrı bir statik analiz aracı almanız gerekir. Piyasadaki tüm bu araçlar sizin için – Lundin

cevap

12

gcc bu konuda uyarmak için bir seçenek vardır listelemek için gcc seçeneği -Wmissing-prototypes ile derleyin ve için grep günlüğünde için herhangi bir prototip yok. düzenlemek dayalı

Güncelleme: şimdi gcc kullanamazsınız söz yana

, mevcut derleyici için de benzer bir seçenek bulmak gerekecek. Çoğu derleyicinin böyle bir seçeneği var. Man sayfası veya yerleşik yardım çıktısı ile başlayın.

+0

Üzgünüm, açıklığa kavuşmamış olsaydım, ama kendi yapım sistemi var, bu yüzden gcc'de test edemiyorum. – Gnubie

+5

"derleme sistemi"! = "Derleyici". Bu özel derleme sistemi hangi derleyicinin kullandığını (gcc/icc/clang/.......) uyarılar/hatalar/vb. Etkinleştirmek için çeşitli seçeneklere/anahtarlara sahip olduğunu varsayardım. Bu gcc ... – twalberg

+0

ok olmasa bile, başlamak için yer olurdu, ben kontrol edeceğim. Herkese teşekkürler! – Gnubie

5

ctags bunu yapabilir!

--c-kinds=p

--c-kinds=f

Şimdi sadece o karşılaştırmak için gereken tüm işlev tanımları listesini oluşturur tüm işlev prototipler listesini oluşturur. dedikleri sürece, tanımlanmadan önce

diff -u <(ctags -R -x --sort=yes --c-kinds=f | cut -d' ' -f1) <(ctags -R -x --sort=yes --c-kinds=p | cut -d' ' -f1) | sed -n 's/^-//p'

+0

+1 bu güzel bir çözüm! – jman