对于具有与定义不同的声明的功能,没有GCC警告

时间:2018-04-03 07:42:01

标签: c gcc

C文件定义:

class PhotoFeed: UICollectionViewCell {
    @IBOutlet weak var myUIImage: UIImageView!

}

H文件声明:

   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoItemView", for: indexPath) as! PhotoFeed

            return cell
        }

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
                let cell = collectionView.cellForItem(at: indexPath) as! PhotoFeed

                cell.myUIImage.isHidden = !cell.myUIImage.isHidden

}

主要

#include <stdint.h>
void foo(int i)
{
    if(i>0) bar();
}

由于某些抽象原因,#ifndef FILE_H #define FILE_H void foo(void); #endif FILE_H 未包含在#include "file.h" int main(void) { foo(); } 中。 为什么GCC在这种特殊情况下不会产生任何警告?

1 个答案:

答案 0 :(得分:3)

如评论中所述......

一般而言,必须包含声明函数的标头,该函数既定义了函数,又定义了函数的使用位置。你没有,所以编译器无法发出警告。标题是允许编译器进行必要的交叉检查以确保代码基本完整性的粘合剂。

问题声称:

  • 出于某些抽象原因,file.h未包含在file.c中。

目前尚不清楚这些抽象原因是什么,但无论推理如何,都是错误的。由于问题尚未(更详细地)详细说明问题所在,我们无法帮助您解决问题。然而,他们是假的 - 你做错了。

具体而言, 必须 file.h以及file.c中加入main.c。否则,您无法获得所需的交叉检查 - 或者您需要的警告。您还需要bar()file.c的原型 - 您不应该在没有原型的情况下调用函数(严格来说,非原型声明就足够了,但您真的在范围内想要原型,bar()<stdint.h>中没有file.h的原型。

我使用GCC和选项进行编译:

gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …

我不打算运行代码,直到它干净 - 事实上,-Werror意味着我无法运行代码,直到干净,因为如果有任何警告或错误,编译将失败。如果您愿意,您可以承担更严格的责任;你不应该冒这么大的风险。

请注意,C99和C11都要求在使用之前声明或定义函数。只有古老的C90标准允许调用尚未预先声明或预先定义的函数。