gpt4 book ai didi

c++ - 不允许嵌套函数,但为什么允许嵌套函数原型(prototype)? [C++]

转载 作者:可可西里 更新时间:2023-11-01 18:02:36 26 4
gpt4 key购买 nike

我是 reading导致我问这个问题的链接问题。

考虑以下代码

int main()
{
string SomeString();
}

总之,编译器将其视为函数原型(prototype)而不是字符串 对象。现在考虑以下代码。

int main()
{
string Some()
{
return "";
}
}

编译器说这是无效的,因为我猜嵌套函数定义是不允许的。 如果不允许,为什么允许嵌套函数原型(prototype)?它没有带来任何好处,反而造成混淆(或者我在这里遗漏了一些有效的点?)。

我发现以下是有效的。

int main()
{
string SomeFun();
SomeFun();
return 0;
}

string SomeFun()
{
std::cout << "WOW this is unexpected" << std::endl;
}

这也令人困惑。我原以为 SomeFun() 函数只会在 main 中有作用域。但是我错了。为什么编译器允许像上面那样编译代码?是否有任何实时情况使上述代码有意义?

有什么想法吗?

最佳答案

你的原型(prototype)只是' Forward Declaration '.请查看维基百科文章。

基本上,它告诉编译器“如果标签‘SomeFun’以这种方式使用,请不要 panic ”。但是您的链接器负责找到正确的函数体。 p>

您实际上可以声明一个伪造的原型(prototype),例如'char SomeFun()' 并在你的 main 中使用它。只有当您的链接器试图找到您的伪造函数的主体时,您才会得到一个错误。但是你的编译器会很酷。

好处多多。你必须记住函数体并不总是在同一个源代码文件中。它可以在链接库中。此外,该链接库可能具有特定的“链接签名”。使用条件定义,您甚至可以在构建时使用范围原型(prototype)选择正确的链接签名。尽管大多数人会使用函数指针而不是。

希望这对您有所帮助。

关于c++ - 不允许嵌套函数,但为什么允许嵌套函数原型(prototype)? [C++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/928992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com