可视化 如何在C++中获取指向main()方法的函数指针

visual How do I obtain a function pointer to the main() method in C++?

本文关键字:main 方法 指针 函数 取指 C++ 获取 可视化      更新时间:2023-10-16

我正在研究 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这是一个非常特殊的功能。

这些规则(一般(不适用于其他职能。

另请注意,视觉C++在未诊断结果类型方面是错误的void

最后,请注意,编写非标准void比标准int多输入一个字符,即,这只是一件非常非常愚蠢的事情。

PS:Visual C++ 可能是在喃喃自语int main,因为它(可能(在内部将void main转换为int main,并且可能这样做是为了在积极支持void main的同时使事物与非智能链接器链接,以便例如Microsoft自己的文档中的非标准示例将编译。无论如何,这是我的理论#1,因为你问了。但这当然是纯粹的猜测,甚至那些编码的人也可能不清楚为什么(理论#2(。

好吧,如果您真的想更改可执行文件的入口点,请按照此处的步骤找到可选标头,偏移 16 个字节并更改 4 个字节。您可以在此处找到 PE 规格。为了在运行时更改可执行文件本身,您将需要一些汇编技巧,或者发出另一个可执行文件,运行批处理并终止正在运行的进程。