c/c++开发分享在C ++中缺少前向声明的问题

我已经编译了以下程序而没有在C前向声明函数。 它已成功编译并在GCC运行,没有任何警告或错误。

 #include  int main() { int ret = func(10, 5); } int func(int i, int j) { return (i+j); } 

但是,我编译了以下程序而没有在C++正向声明函数,编译器给了我一个错误。

 #include  using namespace std; int main() { int ret = func(10, 5); } int func(int i, int j) { return (i+j); } 

一个错误:

 fl.cpp:6:22: error: 'func' was not declared in this scope int ret = func(10, 5); ^ 

为什么C ++编译器会出错? 是不是默认采用int数据类型?

    好吧,它与C语言中的错误一样多。

    考虑到问题是基于“假设”代码从C编译器的角度来看是有效的,让我详细说明,根据规范( C11 ),不允许隐式声明函数。 使用严格的一致性编译代码并且(任何符合标准的)编译器将在C中产生相同的错误。

    查看实例

    引用C11 ,前言/第7页, “第二版的主要变化包括:”

    同样存在于C99


    注意: 为什么它可能有效

    C99 ,这个代码实际上有成功编译的空间。 如果缺少函数原型,则假定函数返回一个int并接受任意数量的参数作为输入。 现在非常非标准,具有遗留支持的编译器可能会选择允许编译这样的代码,但严格来说,符合标准的编译器应该拒绝这样做。

    为什么C ++编译器会出错?

    因为您不应该调用尚未在C ++中声明的函数。

    是不是默认采用int数据类型?

    不。以前是另一种语言的情况,C。在C ++中不是这种情况(从后来的标准版本也不是C)。

    在C ++中,您无法调用未声明的函数。 在C中,如果函数的定义返回int,则可以在没有前向声明符的情况下调用函数。 这是因为旧的K&Rfunction定义风格。 这对于ANSI-C来说已经过时,总是用原型声明一个函数。

    完成图片并与Sourav Ghosh的答案相关。 以下是C ++标准对此问题的看法:

    [expr.call] p2 :

    [注意:如果使用函数或成员函数名称,并且名称查找未找到该名称的声明,则程序格式错误。 这样的调用没有隐式声明任何函数。 – 结束说明]

    无法明确表达出来。

      以上就是c/c++开发分享在C ++中缺少前向声明的问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545988.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注