在所有版本的C中,没有原型的函数声明已经被弃用。

19
我在iOS项目的Pod文件上使用Firebase Analytics。但是当我运行此应用程序时,出现了以下错误。
引用如下: “C语言的所有版本都已弃用无原型的函数声明”。
该错误显示在以下代码上(位于Firebase库中):
GDTCORNetworkType GDTCORNetworkTypeMessage() {.  <----error here
#if !TARGET_OS_WATCH
  SCNetworkReachabilityFlags reachabilityFlags = [GDTCORReachability currentFlags];
  if ((reachabilityFlags & kSCNetworkReachabilityFlagsReachable) ==
      kSCNetworkReachabilityFlagsReachable) {
    if (GDTCORReachabilityFlagsContainWWAN(reachabilityFlags)) {
      return GDTCORNetworkTypeMobile;
    } else {
      return GDTCORNetworkTypeWIFI;
    }
  }
#endif
  return GDTCORNetworkTypeUNKNOWN;
}

我尝试过执行 pod update,但仍然无法解决问题。

供参考,除此之外,我还有这个特定的issue,并且我在使用 Xcode 而不是 RN。


5
在错误行的空括号中输入 void - HangarRash
@HangarRash 我已经尝试解锁文件并添加它们,但仍然没有成功。 - MetaSnarf
我不确定为什么你会遇到这个错误,但是你的函数原型只需简单地写成 GDTCORNetworkType GDTCORNetworkTypeMessage();。它用于分离接口和实现。尝试将此行添加到文件顶部。但我怀疑这不是源代码中唯一没有定义原型的函数。 - Matic Oblak
1
警告:没有原型的函数声明在所有版本中都已过时。 - Ptit Xav
也许你需要更新 cocoapods 本身? - Cy-4AH
5个回答

16

我在Firebase Analytics中遇到了同样的问题,并按照@HangarRash所提供的意见进行了操作。

在错误行的空括号中放入void。

有一个“修复”按钮,如果你点击小红叉,它会自动为你完成。

它让我解锁,但是这个步骤很顺利,我可以保存和构建。有大约六个这样的问题需要修复,然后就可以构建了。


15

简述

在你的 Podfile 文件中应用以下代码(post_install):

 post_install do |installer|
    react_native_post_install(installer)
    __apply_Xcode_12_5_M1_post_install_workaround(installer)
    installer.pods_project.targets.each do |target|
      # Make it build with XCode 14
      if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
        target.build_configurations.each do |config|
            config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
        end
      end
      # Make it work with 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

细节

首先,感谢这篇Github帖子

与此同时,GDT也发布了修复补丁


这对我有用。谢谢你的分享。基本上是这样的:

为com.apple.product-type.bundle设置CODE_SIGNING_ALLOWED = NO

为GoogleDataTransport设置CLANG_WARN_STRICT_PROTOTYPES = NO

- undefined

4
我曾经遇到过同样的问题,下面的修复方法对我起了作用。通过在你的Pods项目设置中禁用Strict Prototypes,我成功地构建和运行了项目。
Pods => Build settings => Strict Prototypes => set to NO

Pods PROJECT


1
这是正确的答案,使用Xcode 15就可以了。谢谢! - undefined

3

这里说的是,自1990年以来,C标准已将形式为void func ()而非void func (void)的函数标记为过时。因此,在C语言中,您现在不应该编写带有空括号的函数。与C++不同,两种形式是等效的。

在即将发布的C23标准中,这将不再是一个问题,因为旧的“K&R风格”函数将从C语言中删除,void func ()将被视为您键入了void func (void)


我认为空括号表示一个接受未指定数量参数的函数。 - user129393192
@user129393192 它确实间接地影响,因为它是一种非原型格式,编译器在找到函数定义之前无法知道传递的类型。但这实际上从来不是一个“功能”,只是语言的缺陷。 - Lundin
@user129393192 这也让我感到困惑,可以参考https://dev59.com/zrDmpogBymzxlkE8lIDD - Lundin
我明白了。你的意思是“未知数量的参数”这个特性在1989年被弃用了...而现在在C23中,它最终表示为“void”...但我没有完全理解编译器是否在此期间支持哪个版本。我觉得我在使用原型和定义本身时可能漏掉了一个关键点。 - user129393192
明白了。所以现在只是在坚持统一性的概念。那么回到原始的 int main() {},似乎在 C17(附带定义)中它表示不接受任何参数,所以我觉得很奇怪编译器(clang)会对此报错。 - user129393192
显示剩余16条评论

-4
在每个函数中添加 (void) 会导致此错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接