C# 为什么函数需要在它之前声明';定义或使用什么?

C# 为什么函数需要在它之前声明';定义或使用什么?,c#,java,c++,c,C#,Java,C++,C,在C语言中,它是可选的。C++中的一个“强”>“必须”在它使用/定义之前声明一个函数。为什么会这样?需要什么?我们在C#或Java中不这样做 有趣的是,当我们定义一个函数时。定义本身有一个声明,即使在那时,我们也需要声明。天知道为什么?你提到这一点很有趣,就在本周,埃里克·利珀特(Eric Lippert)写了一篇与你的问题相关的博文: 基本上,这与编译器的工作方式有关。C#和Java编译器进行了多次编译。如果遇到对未知方法的调用,这不是错误,因为稍后可能会找到定义,调用将在下一次传递时解决。

在C语言中,它是可选的。C++中的一个“强”>“必须”<强>在它使用/定义之前声明一个函数。为什么会这样?需要什么?我们在C#或Java中不这样做


有趣的是,当我们定义一个函数时。定义本身有一个声明,即使在那时,我们也需要声明。天知道为什么?

你提到这一点很有趣,就在本周,埃里克·利珀特(Eric Lippert)写了一篇与你的问题相关的博文:

基本上,这与编译器的工作方式有关。C#和Java编译器进行了多次编译。如果遇到对未知方法的调用,这不是错误,因为稍后可能会找到定义,调用将在下一次传递时解决。请注意,我的解释过于简单,我建议您阅读Eric Lippert的帖子以获得更完整的答案…

Java和C#同时指定语言和二进制对象文件格式,它们是多程编译器

因此,他们能够窥视以后的定义或单独编译的定义

C不能以这种方式工作,原因如下:

  • 如果不使用托管代码,使用类型信息定义与机器无关的对象格式会困难得多

  • C故意允许绕过类型机制

  • 最初定义时,通常没有足够的内存来运行复杂的编译器,也没有原型可以读取

  • C程序必须具有任意大的系统特定库和搜索路径机制。所有这些都妨碍了定义基于对象模块的类型系统

  • C可移植性和互操作性的部分基础是规范的“仅输入语言”性质

  • 直到最近,即使是C语言有限的一次通过特性对于大型程序来说也几乎不实用。像Java或C这样的东西是不可能的:你可以休假,你的
    make(1)
    仍然无法完成


基本上,这取决于如何为该语言编写编译器。 在C++中,决定是使一次编译成为可能。为此,您(或更确切地说,编译器)需要能够首先读取所有类、方法等的声明,然后读取实现(或者以C++术语,定义)。在爪哇和C语言中,编译器首先读取所有代码,生成与读取头文件时C++编译器生成的内容对应的代码。然后C#/Java编译器读取实现(也称为定义)。因此,在C++中,开发人员被要求编写声明,而在C语言中,编译器多次运行代码,为开发人员执行声明工作。 另一方面,其他语言通常要求您按照所需的顺序编写函数(如果函数B使用函数A,则必须先定义函数A)。这些语言中的大多数都有允许您绕过此问题的结构。在(Turbo)Pascal中,解决方案在某种程度上与C++中的相同。

C++中的“必须”在使用或定义之前声明函数。为什么会这样?需要什么?我们在C#或Java中不这样做

我想说,这不是真的。是的,在C++中,在引用函数签名之前必须先定义函数签名(原型)。但是,您可以将该实现留待以后使用

在Java中,这不起作用:如果没有编译某个类(注意:与实现一起)并在javac类路径中可用,则无法调用该类的方法。因此,Java在这个意义上更加严格。

C++与Java/C#-单过程编译器(C++)与多过程编译器(Java&C#)。多个过程允许Java和C#编译器窥视未来的类型和函数原型


C++ +C——具有默认声明的C元素基本上是一个错误,用C++固定。它会导致问题,并且是对gcc启用的警告。在C++中,参数是函数导出名称(名称Mangle)的一部分,因此必须在正确的函数被调用之前知道。

根据您的问题,我猜您不太喜欢C++。实际上,我爱上了C/C++。然后我学习了Java,我感觉很好。现在,我在做C。我非常喜欢它,但现在我开始发现C/C++中的错误:(我们不应忘记,C++中的成员函数调用在C++中取消了这个限制:<代码>结构> {无效f*){();/*在声明之前!*/}无效g-(){}}告诉我一个找到了完美编程语言的程序员,我会告诉你一个对该语言没有完全理解的程序员。你不必在定义之前声明函数。定义是一个完全有效的声明。当然,成员函数必须在类体内声明,但即使是恩,它可以同时声明和定义。我没有-1你,因为我认为-2就足够了。但是,你听说过接口吗?在OOP中,它们与你能得到的函数原型非常接近。关于java的部分根本不是真的。java规范说:“不同编译单元中声明的类型可以相互依赖,java编译器必须同时编译所有这些类型”(7.3)C++中的部分也不是真的。问题中的家伙是正确的。最后一点实际上是<>代码的缺点(1)。,不太像C。它非常通用且功能强大,但价格非常昂贵:
make
根本不了解它在做什么。通过了解C的基本知识,一个更专业的工具在构建C时可以非常非常有效。例如,
make
只是不需要检查标题。