2011-07-15 19 views
32

Şu anda Xcode 4 kullanıyorum ve .pch dosyasında şu makroya sahibim: #define localize(s) NSLocalizedString((s), nil).
Bu makroyu bazı .m dosyalarında kullanmaya çalıştığımda, şu uyarıyı aldım: Implicit declaration of function 'localize' is invalid in C99.İşlevsel örtme bildirimi - C99

Bu kod sorunsuz bir şekilde derlenmiştir, ancak bunu nasıl düzeltebilirim?

+0

Sorunu yeniden üretemedim, derler ve düzgün çalışır, hiçbir uyarı vermez. – Lio

+0

XCode'da bir hata gibi görünüyor ... 4.0.2 Sanırım. 4.2 beta çalışıyor. – Misa

cevap

34

Kapalı fonksiyon bildirimleri derleyici (prototip veya fonksiyon tanımlama ilk olarak görülmektedir burada olanların aksine) bir işlev olarak kullanılan ilk gördüğü olanlardır.

Görünüşte kodunuz localize(foo) kullanıyordu, ancak makro tanımı görünmüyordu. Olası nedenler: #include'u, yerelleştirme makrosunu veya başlıkların pre-derlemesini içeren dosyayı unuttuysanız, localize makrosunu içermedi, bu yüzden unexpanded bırakıldı.

+3

Ancak bu, Xcode'ta bir hatayı gösterir, eğer makro projenin önek başlığında tanımlanmışsa, bu başlık önceden derlenmeli ve tüm derleme birimlerinde kullanılabilir olmalıdır (ör. Projedeki her .m dosyası). FWIW Hala bu hatayı Xcode 4.4.1'de görüyorum ama Xcode'u bırakıp yeniden başlatmak onu düzeltir. – Mason

+2

Muhtemelen 'üstbilgilerin ön derlemesi güneye gitti' altında olabilir. Araçlardaki hatalarla, her şey olabilir. – Jens

+0

Bunun Xcode 5'te gerçekleştiğini gördüm. Uyarı mesajından kurtulmanın en güvenli yolu, hatayı gösteren dosyanın içindeki ilgili başlık dosyasını eklemektir. – JaredH

50

Bu sorunu, DLog ile NSLog'un global değiştirmesini yaptığımda yaşadım. Aptalca

#define DLog(...) NSLog(... 

ifadeleri dahil, bu yüzden

#define DLog(...) DLog(... 
uyarıları neden

ve bağlayıcı hata ile sona erdi.

2

Karşılaştığım bir başka "saçma" hata, DLog'umun iOS hedefinin önek başlığında tanımlanmış olmasıydı. Bu yüzden, OSX hedefinin önekine de kopyalamak zorunda kaldım ...

yanlışlıkla böyle CocoaLumberjack ithal çünkü
1

bu sorun vardı:

#import <CocoaLumberjack/DDLog.h> 

Görünüşe CocoaLumberjack ekibi biraz daha kod modularized; ve DDLogError gibi makrolar artık kendi başlık dosyasında ayrı ayrı tanımlanmıştır.

Bununla ithalat beyanı değiştirilir ve hata uzağa gitti:

#import <CocoaLumberjack/CocoaLumberjack.h> 
1

Benim durumumda sadece bir dosya bu hatayı veriyordu. Projenin testlerinin üyeliğine (sağdaki Dosya Müfettişinde) eklediğimi ortaya çıkardı.