gpt4 book ai didi

c++ - 如何在 C++ 中获取指向 main() 方法的函数指针?

转载 作者:行者123 更新时间:2023-11-30 00:56:35 28 4
gpt4 key购买 nike

我正在研究 MS C++ 编译器,并完成了下一个程序:

#include <stdio.h>

void main(void)
{
void(*ptr)(void) = &main;
}

我想在 main() 方法/函数上创建一个指针,但出现了下一个错误:

error C2440: 'initializing' : cannot convert from 'int (__cdecl *)(void)' to 'void (__cdecl *)(void)'
This conversion requires a reinterpret_cast, a C-style cast or function-style cast

我想知道:

  • 如何获取函数/方法 main() 的指针
  • 为什么默认情况下输出是关于 int __decl... 的信息,但我在 main() 上写的是 void 而不是 int?

最佳答案

以下是获取指向 main 函数的指针的方法:

#define DECLARE_UNUSED( name ) (void) name;  struct name

int main()
{
int(*ptr)() = &main;
DECLARE_UNUSED( ptr ); // Prevents using `ptr`.
// Don't use `ptr` here. In particular, don't call.
}

注意

  • main 的结果类型必须为 int

  • 调用 main(例如通过该指针)会导致未定义的行为。

  • main 没有必要返回任何东西;默认返回值为 0。

如您所见,main 是一个非常特殊的函数。

这些规则(通常)不适用于其他功能。

另请注意,Visual C++ 不诊断 void 结果类型是错误的。

最后,请注意,编写非标准的 void 比标准的 int 多输入一个字符,也就是说,这是一件非常非常愚蠢的事情。 ;-)

PS:Visual C++ 可能int main 含糊不清,因为它(可能)将 void main 翻译成 int main 在内部,它可能这样做是为了让事情与非智能链接器链接,同时积极支持 void main 这样例如微软在其文档中的非标准示例将被编译。无论如何,这是我的第一理论,既然你问了。但这当然是纯粹的猜测,甚至那些编写代码的人也可能不清楚原因(理论 #2)。

关于c++ - 如何在 C++ 中获取指向 main() 方法的函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746560/

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