【问题标题】:Function overloading possible in c? [duplicate]c语言中可能的函数重载? [复制]
【发布时间】:2020-11-27 00:36:15
【问题描述】:

我们在 C 中有函数重载吗? main() 函数是如何工作的?如果我们使用 int main() 或 void main() 或 char main(),它工作得非常好。这是如何在 C 中管理的?

【问题讨论】:

  • 在支持它的语言中,返回类型通常不参与重载过程(除了一些值得注意的例外,如 Perl 和 Haskell)。
  • 撇开void main()char main() 不是main 的有效签名这一事实不谈,这并不是重载。重载允许具有相同名称的不同函数一起存在于一个声明性区域中。您所描述的总是涉及一个单一定义。
  • main() 在 C 中可以有不同的签名,因为 C 语言标准为 main() 指定了它。请注意,正如@StoryTeller-UnslanderMonica 所提到的,您对main() 的一些签名并未由标准指定。您的编译器允许它们的事实要么是疏忽,要么是对标准行为的扩展。
  • 而且...除非您正在为独立环境编程,否则除了int main(void)int main (int argc, char *argv[]) 之外的所有内容都是错误的。 C11 Standard - 5.1.2.1 Freestanding environmentC11 Standard - §5.1.2.2.1 Program startup(p1)

标签: c overloading main void return-type


【解决方案1】:

我们在 C 中有函数重载吗?

没有。

函数标识符始终具有外部链接或内部链接。在整个程序中,每个被访问的具有外部链接的标识符都指的是一个函数或对象。 (从未被引用的标识符可能不引用任何实际存在的函数或对象。)在任何翻译单元中,可以将在别处具有外部链接的标识符声明为具有内部链接,在这种情况下,它代替标识(一个) 函数或对象出现在同一翻译单元的其他位置。

在任何情况下,在任何给定的翻译单元内,引用现有函数的范围内函数标识符都恰好指代一个现有函数。

main() 函数是如何工作的?如果我们使用 int main() 或 void main() 或 char main() ,它工作得非常好。

在大多数情况下,main() 的工作方式与任何其他函数一样,但有一些额外的规则。具体来说,一个严格遵守的 C 程序可以选择main() 的两个签名之一:

int main(void)

int main(int argc, char *argv[])

(或等效公式)。每个程序必须选择一个。对这些签名之间的选择进行任何调整是 C 实现的工作。

如果你的程序声明main() 的返回类型不是int,那么它是不(严格)符合的。尽管如此,任何特定的实现都可能接受其他形式,并且这些形式似乎与这样的实现“工作得非常好”,但语言标准根本没有提供任何基础来期望这样的程序有任何特定的行为。

另请注意,main()alternative 签名不构成函数重载。在任何情况下,任何程序中都只有一个名为main的外部函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2019-06-21
    • 1970-01-01
    • 2018-07-23
    • 2023-03-07
    • 2011-07-14
    • 2011-12-31
    相关资源
    最近更新 更多