1. ホーム
  2. ios

[解決済み] Xcode 9で「この関数宣言はプロトタイプではありません」という警告が表示される。

2022-08-08 14:43:39

質問

Xcode 9を使用しているとき、以下のようなコンパイラの警告が表示されることがあります。 This function declaration is not a prototype . これは void を追加することを提案し、それを解決します。私が抱えている問題は、これらの警告が、次のようなシステムAPIに対しても投げられることです。 UIApplication delegate-methodsのようなシステムAPIに対しても警告が投げられることです。

- (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がデリゲートメソッドを挿入するのか気になるところです。 void を挿入するのか、それとも iOS 11 Beta の後のバージョンで挿入するのでしょうか。私が気になっているのは、もし void ボディを含めると、Xcodeはmismatching method-selectorsについて文句を言うからです(これは理にかなっています)。誰かがこれまでに同じ問題を経験しましたか?

どのように解決するのですか?

ブロック宣言に空白の括弧がある。

void (^)()

は、空白の括弧を持つ関数ポインタと同じ意味を持ちます。

void (*)()

引数がないわけではありません。引数が指定されていないということなので、以下のような呼び方ができるため、バグへの道が開かれることになります。

void (^block)() = ...
block();
block(10);
block(@"myString");

パラメータを持たないブロックを宣言する場合は、必ず

void (^)(void)

Appleはどこでもそれを正しく行っていたわけではなく、互換性の理由から古いAPIについてはおそらく修正していないでしょう。新しい API に移行するまでは、その警告をそこに表示しておく必要があります。

また、この警告をオフにすることもできます ( -Wstrict-prototypes ):

または #pragma (ありがとうございます デービッド・パスドク ):

#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の議論を参照してください。 ここで にあるバグを参照してください。 オープンレーダー .

APIの内部動作に変更がないため、すべてのコードが動作することに注意してください。私たちが知ることができるのは、APIが本来あるべき姿ではないことだけです。