Skip to content

Xcodeでの非推奨関数プロトタイプエラーの解決法

エラー概要

Firebase Analyticsを含むiOSプロジェクトをXcodeでビルド中に次のエラーが発生します:

error
A function declaration without a prototype is deprecated in all versions of C

このエラーは主にGoogleDataTransportライブラリの次の関数定義で発生します:

objc
GDTCORNetworkType GDTCORNetworkTypeMessage() { // ← ここでエラー
#if !TARGET_OS_WATCH
  SCNetworkReachabilityFlags reachabilityFlags = [GDTCORReachability currentFlags];
  if ((reachabilityFlags & kSCNetworkReachabilityFlagsReachable) ==
      kSCNetworkReachabilityFlagsReachable) {
    if (GDTCORReachabilityFlagsContainWWAN(reachabilityFlags)) {
      return GDTCORNetworkTypeMobile;
    } else {
      return GDTCORNetworkTypeWIFI;
    }
  }
#endif
  return GDTCORNetworkTypeUNKNOWN;
}

エラー原因は関数定義内の()がプロトタイプを指定していないK&Rスタイル関数宣言を使用しているためです。これはC言語標準で非推奨となっています。


解決方法(3つのアプローチ)

推奨アプローチ

プロジェクト規模やポリシーに応じて最適な方法を選択してください。方法1か方法2が恒久的な解決策として推奨されます。

方法1: Build Settingの変更(Xcode UI操作)

  1. Xcodeでプロジェクトを開く
  2. ナビゲータからPodsプロジェクトを選択
  3. ターゲット一覧からGoogleDataTransportを選択
    • 複数バージョンがある場合は全てのGoogleDataTransport関連ターゲットを修正
  4. Build Settingsタブを開く
  5. 検索ボックスにstrict prototypesと入力
  6. Strict Prototyping設定をNOに変更

Xcode設定画面イメージ

複数ターゲットがある場合

GoogleDataTransport-CoreOnlyやGoogleDataTransport-fooなどの関連ターゲット全てに同じ設定を適用してください。

plaintext
Targets:
  - GoogleDataTransport
  - GoogleDataTransport-foo (バージョン依存)
  - GoogleDataTransport-bar

方法2: Podfile設定(自動化推奨)

Podfileにpost_installフックを追加してビルド設定を自動変更:

ruby
post_install do |installer|
  # React Native固有の設定がある場合はそのまま保持
  react_native_post_install(installer) if defined?(react_native_post_install)
  
  installer.pods_project.targets.each do |target|
    # GoogleDataTransport関連ターゲットを特定
    if target.name.start_with? "GoogleDataTransport"
      target.build_configurations.each do |config|
        config.build_settings['CLANG_WARN_STRICT_PROTOTYPES'] = 'NO' 
      end
    end
  end
end

適用手順:

  1. Podfileを編集して上記コードを追加
  2. ターミナルでコマンド実行:
bash
pod install

既存のpost_installフックがある場合

既存のpost_installブロックがある場合はマージしてください。例:

ruby
post_install do |installer|
  # 既存の設定...
  __apply_Xcode_12_5_M1_post_install_workaround(installer)
  
  # ここにGoogleDataTransport用設定を追加...
end

方法3: ソースコード直接修正(一時的対策)

objc
GDTCORNetworkType GDTCORNetworkTypeMessage(void) { // voidを追加
  // ...既存の実装
}

修正手順:

  1. エラー発生箇所をダブルクリック
  2. Xcodeが提案する「Fix」ボタンをクリック
  3. ファイルがロックされている場合は「Unlock」を選択
  4. 全エラー箇所に対して繰り返し適用

:::caution 注意点

  • 3rdパーティライブラリを直接修正するとpod update時に変更が上書きされます
  • 恒久的な解決策ではないため方法1/2が推奨
  • 複数ファイルで同様のエラーが発生する可能性あり :::

技術的背景説明

エラーの根本原因

C言語では歴史的な理由で2種類の関数宣言が存在します:

c
// 非推奨: 引数情報がないK&Rスタイル
return_type function()

// 推奨: 明示的にvoidを指定
return_type function(void)

新しいCコンパイラは前者をstrict-prototypes違反とみなし警告を発生させます。

影響範囲

  • 環境: Xcode 14.0+ (特にApple Clang 15)
  • 対象ライブラリ: GoogleDataTransport v9.2.0以前

将来の見通し

  • C23標準function()function(void)と同等に扱われるよう改訂
  • GoogleDataTransportの新版では既に修正済み
  • 長期的にはpod updateだけで解決可能に

最終推奨

方法2のPodfile設定が最適解です。理由:

  1. ライブラリ更新時に設定が維持される
  2. プロジェクト全体に影響しない
  3. ソース修正より安全
  4. チームメンバー全員に統一設定を適用可能