"This function declaration is not a prototype" 警告 Xcode 9
"This function declaration is not a prototype" warning in Xcode 9
当使用 Xcode 9 时,有一些编译器警告说 This function declaration is not a prototype
。它建议将 void
添加到方法体中,这将解决它。我遇到的问题是,这些警告也会针对系统 API 引发,例如 UIApplication
delegate-methods:
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
withResponseInfo:(NSDictionary *)responseInfo
completionHandler:(void (^)())completionHandler
这可以通过以下方式解决:
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
withResponseInfo:(NSDictionary *)responseInfo
completionHandler:(void (^)(void))completionHandler
现在我想知道委托方法是否仍会长期有效,或者 Apple 会在以后的 iOS 11 Beta 版本中插入 void
。我很好奇,因为如果我包含 void
主体,Xcode 会抱怨不匹配的方法选择器(这是有道理的)。到目前为止有人遇到过同样的问题吗?
带空括号的块声明:
void (^)()
与带有空括号的函数指针具有相同的语义:
void (*)()
不代表没有争论。这意味着未指定参数,因此它为错误打开了道路,因为您可以通过以下方式调用它:
void (^block)() = ...
block();
block(10);
block(@"myString");
当声明没有参数的块时,总是使用:
void (^)(void)
Apple 并没有在所有地方都正确地做到这一点,出于兼容性原因,他们可能不会为旧的 API 修复这个问题。在移动到较新的 API.
之前,您必须保留该警告
您也可以关闭该警告 (-Wstrict-prototypes
):
或使用#pragma
(感谢@davidisdk):
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
withResponseInfo:(NSDictionary *)responseInfo
completionHandler:(void (^)())completionHandler {
}
#pragma clang diagnostic pop
查看 LLVM 讨论 here or the bug on openradar。
请注意,API 的内部工作没有变化,所有代码仍然有效。我们只会知道API没有达到应有的水平
当使用 Xcode 9 时,有一些编译器警告说 This function declaration is not a prototype
。它建议将 void
添加到方法体中,这将解决它。我遇到的问题是,这些警告也会针对系统 API 引发,例如 UIApplication
delegate-methods:
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
withResponseInfo:(NSDictionary *)responseInfo
completionHandler:(void (^)())completionHandler
这可以通过以下方式解决:
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
withResponseInfo:(NSDictionary *)responseInfo
completionHandler:(void (^)(void))completionHandler
现在我想知道委托方法是否仍会长期有效,或者 Apple 会在以后的 iOS 11 Beta 版本中插入 void
。我很好奇,因为如果我包含 void
主体,Xcode 会抱怨不匹配的方法选择器(这是有道理的)。到目前为止有人遇到过同样的问题吗?
带空括号的块声明:
void (^)()
与带有空括号的函数指针具有相同的语义:
void (*)()
不代表没有争论。这意味着未指定参数,因此它为错误打开了道路,因为您可以通过以下方式调用它:
void (^block)() = ...
block();
block(10);
block(@"myString");
当声明没有参数的块时,总是使用:
void (^)(void)
Apple 并没有在所有地方都正确地做到这一点,出于兼容性原因,他们可能不会为旧的 API 修复这个问题。在移动到较新的 API.
之前,您必须保留该警告您也可以关闭该警告 (-Wstrict-prototypes
):
或使用#pragma
(感谢@davidisdk):
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
withResponseInfo:(NSDictionary *)responseInfo
completionHandler:(void (^)())completionHandler {
}
#pragma clang diagnostic pop
查看 LLVM 讨论 here or the bug on openradar。
请注意,API 的内部工作没有变化,所有代码仍然有效。我们只会知道API没有达到应有的水平