c++ - 为什么 C++ 对函数原型(prototype)(签名)的前向声明更加严格?

标签 c++ c function gcc compiler-errors

我注意到 C++ 在使用之前声明函数签名方面比 C 更严格,即使函数定义是在实际调用它们的函数之后声明的?

我一直认为 C 的限制性更强,但似乎并非如此。

为什么在制定 C++ 编程语言标准时理念发生了变化?

例如,以下代码在 gcc 命令上运行编译良好,但在尝试使用 g++

进行编译时输出错误
#include<stdio.h>

int main()
{
    int a=sum(4,6);
    printf("%d",a);
    return 0;
}

int sum(int a,int b)
{
    return a+b;
}

错误是

‘sum’ was not declared in this scope

最佳答案

在较早的(C99 之前)C 标准中,有一种称为“隐式函数声明”的东西,自 C99 以来已被删除。 因此,如果您在 C90 模式下编译,编译器必须支持该“功能”。而在 C++ 中,从未出现过“隐式函数声明”。所以 GCC 出错了。您的代码在现代 C(C99 或更高版本)中也无效。

使用更严格的编译器开关(例如 -std=c99 -Wall -Wextra -pedantic-errors)进行编译并注意所有诊断。

关于c++ - 为什么 C++ 对函数原型(prototype)(签名)的前向声明更加严格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46645399/

相关文章:

C++ 的默认继承访问说明符?

c++ - 拖动鼠标时QTreeView selectedIndex问题

c++ - 为每个模板实例化生成唯一的类型或 ID? (示例观察者模式)

c - 降低流程的良好值(value)

c++ - 将 std::function<void(string, string)> 转换为通用 std::function<void()>

c++ - 在 vector 对中查找元素并输出C++

c - 为什么 C 中允许获取函数参数的地址?

javascript - 从 Eloquent JavaScript 理解 eventListener 解决方案

javascript - 使用 --- innerHTML = "...<a href=' http ://. 在 javascript 函数中创建链接。 .'>HttpLink</a>..."

c - 最佳本地套接字命名实践