可视化 如何在C++中获取指向main()方法的函数指针
visual How do I obtain a function pointer to the main() method in C++?
我正在研究 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 规格。为了在运行时更改可执行文件本身,您将需要一些汇编技巧,或者发出另一个可执行文件,运行批处理并终止正在运行的进程。
相关文章:
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 如何在 C 中使用空的 main() 方法运行函数?
- std::chrono 在从 main 或 from 类方法使用时给出不同的值
- main.cpp从 .h 文件调用公共虚拟方法
- 在 C++ 中解析 main 函数的大量输入的正确方法是什么
- C :使用Main中定义的对象方法的函数
- C++ - 在 main() 方法内的类实例中创建一个线程并调用 Sleep()
- C++ - 类方法更改成员变量,但不在 main 中
- main.cpp:(.text+0x8f):对[对象方法]的未定义引用
- 如何在 Main 方法之外将字符串拆分为标记
- 在类方法中包括Main()的容器
- 在 之前执行代码。NET 的 Main() 方法
- c++:在main方法中运行函数
- Main 方法与教程中的方法不同
- 为什么c中的main方法总是放在类中,而不是放在c++中
- 如何为c++可执行文件中的main()方法使用main.cpp以外的文件名
- 花括号和main方法中的返回值
- 更改Code::Blocks中的main方法
- 在main方法中调用返回String的函数
- C++:新建空项目(如何创建,添加main方法并打印"Hello, world")?