C# 为什么函数需要在它之前声明';定义或使用什么?
在C语言中,它是可选的。C++中的一个“强”>“必须”<强>在它使用/定义之前声明一个函数。为什么会这样?需要什么?我们在C#或Java中不这样做C# 为什么函数需要在它之前声明';定义或使用什么?,c#,java,c++,c,C#,Java,C++,C,在C语言中,它是可选的。C++中的一个“强”>“必须”在它使用/定义之前声明一个函数。为什么会这样?需要什么?我们在C#或Java中不这样做 有趣的是,当我们定义一个函数时。定义本身有一个声明,即使在那时,我们也需要声明。天知道为什么?你提到这一点很有趣,就在本周,埃里克·利珀特(Eric Lippert)写了一篇与你的问题相关的博文: 基本上,这与编译器的工作方式有关。C#和Java编译器进行了多次编译。如果遇到对未知方法的调用,这不是错误,因为稍后可能会找到定义,调用将在下一次传递时解决。
有趣的是,当我们定义一个函数时。定义本身有一个声明,即使在那时,我们也需要声明。天知道为什么?你提到这一点很有趣,就在本周,埃里克·利珀特(Eric Lippert)写了一篇与你的问题相关的博文: 基本上,这与编译器的工作方式有关。C#和Java编译器进行了多次编译。如果遇到对未知方法的调用,这不是错误,因为稍后可能会找到定义,调用将在下一次传递时解决。请注意,我的解释过于简单,我建议您阅读Eric Lippert的帖子以获得更完整的答案…Java和C#同时指定语言和二进制对象文件格式,它们是多程编译器 因此,他们能够窥视以后的定义或单独编译的定义 C不能以这种方式工作,原因如下:
- 如果不使用托管代码,使用类型信息定义与机器无关的对象格式会困难得多
- C故意允许绕过类型机制
- 最初定义时,通常没有足够的内存来运行复杂的编译器,也没有原型可以读取
- C程序必须具有任意大的系统特定库和搜索路径机制。所有这些都妨碍了定义基于对象模块的类型系统
- C可移植性和互操作性的部分基础是规范的“仅输入语言”性质
- 直到最近,即使是C语言有限的一次通过特性对于大型程序来说也几乎不实用。像Java或C这样的东西是不可能的:你可以休假,你的
仍然无法完成make(1)
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
只是不需要检查标题。