C WinMain的奇怪返回行为
首先,我应该指定我正在使用VisualStudio中的clang编译器。调试以下简单程序时,WinMain函数会在满足特殊条件时返回变量值C WinMain的奇怪返回行为,c,windows,C,Windows,首先,我应该指定我正在使用VisualStudio中的clang编译器。调试以下简单程序时,WinMain函数会在满足特殊条件时返回变量值 #include <windows.h> int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int var = 1; var = var
#include <windows.h>
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int var = 1;
var = var + 5;
}
#包括
int回调WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpCmdLine,
国际展览(nCmdShow)
{
int-var=1;
var=var+5;
}
上述内容将在调试器中输出:程序“[11396]Project1.exe”已退出,代码为6(0x6)。
只要赋值的右侧表达式中有变量名,则此行为似乎不会失败。如果我修改最后一行,只分配一个文本,例如var=5
,每次输出都是一致的不相关值:程序“[4148]Project1.exe”以代码-858993460(0xCCCC)退出。
我怀疑这种行为与WinMain有关,因为当我改用普通的旧main()时,会得到预期的0返回。你知道这种奇怪行为的原因吗?问题是你没有明确返回任何东西 我想可能是因为您做了一些任意赋值(var=var+5)而在寄存器窗口中留下了一个“看起来有效”的数字用于返回值 但事实是:没有显式的
返回SOMEVALUE代码>,则您的程序正在显示
为了验证这一理论,我建议您使用“/Fa”进行编译,并查看程序集输出:)您应该使用返回0代码>在函数中设置退出代码。奇怪的是,你的编译器没有抱怨它,一定要提高警告级别。我没想到忽略它会导致似乎未定义的行为。显然大多数编译器在编译时都会添加它?至少在使用int main()
而不是WinMain()
时,根据标准,从main返回0是可选的。WinMain显然没有包含在其中,不返回值意味着您通常会得到堆栈上该位置的内容,如果它没有崩溃的话。在Windows中使用调试堆时,0xcccc是未初始化的堆栈内存。这是这个特定编译器的代码生成与您正在使用的优化设置一起工作的方式的一个怪癖。这里可能发生的情况是,var
的新值是使用与函数返回值相同的寄存器计算的。如果您充分提高优化级别,我希望您会看到这种行为变化。Microsoft的MSDN说:“如果函数在进入消息循环之前终止,它应该返回零。”这些是给您的说明,开发人员。感谢您的帮助:)很有趣,没有它它它将无法工作,但是int main()
will“main()”是一个“标准C”的东西。“WinMain()”是“微软的东西”。很简单:)再说一遍——我绝对鼓励您检查这两种语言的汇编语言输出,以满足您的好奇心。根据msandiford的建议,您还可以更改optmization级别,并查看程序集是否更改。它可能:)会的!谢谢