c++ - 编译器/解释器在解释时创建函数通常是个好主意吗?

标签 c++ language-design compiler-construction

当我第一次学习 C++ 时,我注意到函数是从上到下创建的,这与 Java 等语言不同,在 Java 中,函数“声明”在代码中的顺序无关紧要。

C++ 示例:

#include <iostream>
using namespace std;

int main() {
    test();
    return 0;
}

void test() {

}

但是当您交换函数的顺序时,程序可以正常运行。

在设计 C++ 时,这是故意的吗?

最佳答案

与使用相比,C 或 C++ 对函数定义的顺序没有太多要求。

C 允许函数在使用前声明,但(在 C89/90 中)实际上并不需要它。如果调用未声明的函数,则编译器需要对函数的类型做出某些假设(如果函数的定义不符合这些假设,则代码无效)。

但是,C++ 确实要求自由函数至少在使用前声明1。函数定义还声明了该函数,因此微型程序通常在使用前先定义定义,以避免必须将声明与其定义分开编写。

对于类成员,C++ 稍微放宽了限制。例如,这是完全可以接受的:

class Foo { 
    void bar() { baz(); }
    void baz() {}
};

Java 的主要区别在于简单地禁止所有自由函数,因此它只有成员函数,它们遵循与 C++ 成员函数大致相同的规则。


  1. 如果没有这个,基本上不可能支持某些 C++ 功能,例如函数重载。

关于c++ - 编译器/解释器在解释时创建函数通常是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275679/

相关文章:

java - 为什么 Java 不允许 Throwable 的泛型子类?

.net - 在 C++/CLI 中实现常量引用的最佳实践

java - 删除选择冲突而不向前看 - JavaCC

c# - 如何以编程方式调用 C++ 编译器?

c++ - 为多个请求重用同一个套接字连接

c++ - c++中动态分配的链表。发生异常后如何防止内存泄漏?

c++ - 链接使用 i686-w64-mingw32 编译的 POCO 库时出错

perl - 在 Perl 中没有更简单的多行注释的原因是什么?

c++ - 深度优先搜索的实现和改进

java - 您的 javadoc 是否被编译到您的类文件中?