为什么函数声明在c++中是强制性的,而在C中不是
Why are function declaration mandatory in C++ and not in C?
我之前的一个考试有这个问题,直到现在我一直读到在任何语言中都不需要声明?
哪个是正确的?如果没有声明,c++会给出错误,还是会运行?
在涉及C和c++的讨论中,"函数声明"是一个相当模糊的术语。这些语言在这方面有很大的不同。
在c++语言中只有一种函数声明:具有所有参数类型和返回类型的声明。这样的声明是必要的,因为c++语言支持函数重载。为了选择调用哪个函数,编译器需要知道关于函数的所有信息,并且需要知道函数的哪些重载版本是可用的。如果你"忘记"声明某个重载版本,它将不会被重载解析考虑。这至少是c++中必须声明函数的原因之一。
在C语言中有两种函数声明:非原型声明和原型声明(或者简单的原型)。C中的原型非常类似于c++的声明——它包含了所有的参数类型。在标准C中,变量函数(带有...
参数的函数)总是需要原型。对于非可变函数,即使在今天也不需要声明原型。但是从C99开始,所有其他函数至少需要非原型声明。在旧的C89/90版本中,不需要为非可变函数声明函数。
那么,这应该基本上回答了你的问题。在c++中,函数声明是必需的,因为语言特性严重依赖于它们。在现代C语言中,函数声明也是为了使代码更安全。在旧版本的C语言中,不需要函数声明,主要是因为该语言被定义为不需要函数声明。
C中的函数声明不是强制性的,因为遗留/向后兼容的原因-如果它们是强制性的,那么一些旧的/遗留代码将停止编译。
我猜它们在c++中是强制性的,因为c++并不是C的严格超集,所以可以明智地选择强制使用它们。
你应该总是声明它们——看到这个问题必须在C中声明函数原型吗?
C99函数声明现在是强制性的
函数声明在c语言中是强制性的。然而,原型是可选的,除非是可变函数和参数类型会被默认提升改变的函数。
我不能回答c。
在c++中,对于函数:-
void foo();
是一个声明 -
void foo() { .. }
为定义, 为声明。
在调用foo()
之前,需要在作用域中至少有一个声明。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么 'std::reference_wrapper' 在 c++17 中被弃用,而在 c++20 中被删除?
- 在for循环的某些迭代中,字符串的长度为0,而在其他迭代中则不为0
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- 为什么在一个地方需要双倍英镑,而在这个宏观上不需要其他地方?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- 我的代码在发布模式下不起作用,而在Qt的调试模式下工作
- 试图使循环仅检查字符串是否仅数字,而在编程中允许的C IM中允许的负数是一个类项目
- basic_string::替换的超出范围异常,而在范围内,正如调试相同参数的输出所证明的那样
- 循环在此代码中仅迭代一次,而在另一个代码中正确迭代
- 为什么对象在作为指针传递时超出范围,而在返回时则不然
- 为什么友元运算符<<在某些情况下使用,而在其他情况下不使用
- 我们如何有证据表明,声明虚拟函数的类是2个字节,其中一个不超过一个未声明,而在子类中
- 需要在GCC-7.2.0中具有编译错误的代码上的帮助,而在GCC-6.4.0中则不需要编译
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 为什么函数声明在c++中是强制性的,而在C中不是