我刚刚开始使用C ++,我遇到了一个我无法解决的错误。
到目前为止,这是我的所有代码(甚至无法让hello world工作):
#include "stdafx.h"
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, L"Hello World!",
L"Hello World!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
但是当我尝试运行它时会出现此错误:
Test.cpp(11):错误C2373:'WinMain':重新定义;不同类型的修饰符 C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ include \ winbase.h(2588):参见'WinMain'的声明
当我查看WinMain的声明时,我发现在每个参数之前都有一个“__in”。我尝试添加,但没有运气。我也尝试用CALLBACK替换WINAPI,但这也不起作用。
答案 0 :(得分:4)
简单的解决方案是
使用标准main
功能。
像这样:
#undef UNICODE
#define UNICODE
#incude <windows.h>
int main()
{
MessageBox(
0,
L"Hello World!",
L"Hello World!",
MB_ICONEXCLAMATION | MB_SETFOREGROUND
);
}
现在你唯一的问题是使用微软的工具集将它构建为GUI子系统应用程序,这在这方面有点迟钝(GNU工具链没有这样的问题)。
为此,使用Microsoft的link
,使用此链接器选项(除了选择GUI子系统):/entry:mainCRTStartup
。
请注意,您可以将该选项放在名为LINK
的环境变量中。
快乐的编码! : - )
答案 1 :(得分:1)
WinMain是一个C函数,因此需要用extern "C"
#include "stdafx.h"
#include <windows.h>
extern "C"
{
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, L"Hello World!",
L"Hello World!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
}