3

我刚开始使用 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,但这也不起作用。

4

2 回答 2

4

简单的解决方案是

    使用标准main函数

像这样:

#undef UNICODE
#define UNICODE
#incude <windows.h>

int main()
{
    MessageBox(
        0,
        L"Hello World!",
        L"Hello World!",
        MB_ICONEXCLAMATION | MB_SETFOREGROUND
        );
}

现在您唯一的问题是使用 Microsoft 的工具集将其构建为 GUI 子系统应用程序,这在这方面有点迟钝(GNU 工具链没有这样的问题)。

为此,对于 Microsoft 的link,使用此链接器选项(除了选择 GUI 子系统之外):/entry:mainCRTStartup.

请注意,您可以将该选项放在名为LINK.

快乐编码!:-)

于 2013-01-20T19:46:47.583 回答
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;
    }
}
于 2013-01-20T20:28:34.557 回答