Семантическое предупреждение по xcode 4

Я получаю семантическое предупреждение на Xcode 4: * Объявление 'struct sockaddr_in' не будет видно за пределами этой функции * структура, как представляется, объявляется в netinet/in.h

Предупреждение становится отмеченным на Reachability.h, его классе, который я загрузил из примеров Apple.

#import <Foundation/Foundation.h>
#import <SystemConfiguration/SystemConfiguration.h>

typedef enum {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN
} NetworkStatus;
#define kReachabilityChangedNotification @"kNetworkReachabilityChangedNotification"

@interface Reachability: NSObject
{
    BOOL localWiFiRef;
    SCNetworkReachabilityRef reachabilityRef;
}

//reachabilityWithHostName- Use to check the reachability of a particular host name. 
+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;

//reachabilityWithAddress- Use to check the reachability of a particular IP address. 
+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;

//reachabilityForInternetConnection- checks whether the default route is available.  
//  Should be used by applications that do not connect to a particular host
+ (Reachability*) reachabilityForInternetConnection;

//reachabilityForLocalWiFi- checks whether a local wifi connection is available.
+ (Reachability*) reachabilityForLocalWiFi;

//Start listening for reachability notifications on the current run loop
- (BOOL) startNotifier;
- (void) stopNotifier;

- (NetworkStatus) currentReachabilityStatus;
//WWAN may be available, but not active until a connection has been established.
//WiFi may require a connection for VPN on Demand.
- (BOOL) connectionRequired;
@end

Я не понимаю предупреждения, может кто-нибудь объяснить это мне? Спасибо.

Ответ 1

Кто-то подал отчет об ошибке в отношении поведения и получил ответ от кого-то здесь. По сути, проблема в том, что вы объявляете новую структуру (насколько компилятор может сказать) в параметре метода, поэтому он не будет доступен где-либо еще.

Быстрое исправление. Просто добавьте следующую строку в Reachability.h:

#import <netinet/in.h>

Ответ 2

Вы объявляете новую структуру в параметре метода, а не в области файлов.

Предупреждение исчезнет, ​​если вы добавите объявление вперед в начале файла (где-то перед разделом @interface).

struct sockaddr_in ;

Выполнение этого вместо #import <netinet/in.h> позволяет избежать раздувания заголовка.

(Говоря о сокращении заголовка заголовка, вы можете сократить использование заголовка в Reachability.h, заменив строки

#import <Foundation/Foundation.h>
#import <SystemConfiguration/SystemConfiguration.h>

с

#import <SystemConfiguration/SCNetworkReachability.h>

)

Ответ 3

Добавьте #import в Reachability.h, чтобы уйти от этого