根据处理器的不同,我会看到为每个项目定义的宏。所以,在控制台中,它是_CONSOLE
,在 Win32 ,它是_WIN32
当我用IDE打开源文件(.cpp)时,我默认得到控制台环境。
可以使用宏切换到win32或mfc,例如:
#ifdef _CONSOLE
#undef _CONSOLE
#define _WIN32
#endif
所以我希望编译器询问WinMain()
而不是main()
答案 0 :(得分:1)
没有。您不应该取消定义或定义为实现保留的任何宏(除非您的实现文档明确允许它)。您可以从开头的单个下划线和大写字符识别这样的保留宏,或者在标识符中的任何位置识别两个连续的下划线。
您引用的宏称为"预定义宏"。它们可用于检查编译器或操作系统功能,但不能用于启用或禁用它们。
答案 1 :(得分:0)
是的,将MACROS用于不同类型的项目是一种相当常用的做法。我见过人们使用他们的热门项目。
例如,
#if defined(_WIN32)
# include <axxx.h>
#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__))
# include <bxxxx.h>
#endif
关于main
电话,您可以实施它,
#if defined(_WIN32)
INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
#elif defined(_CONSOLE)
int main()
#endif
{
UNREFERENCED_PARAMETER(hInstance); //Incase of Console..
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(nCmdShow);
return 0;
}
答案 2 :(得分:0)
我发现链接器链接到控制台或win32,因此手动链接将解决问题:
#include <iostream>
#include <windows.h>
using namespace std;
#pragma comment( linker, "/subsystem:windows" )
//#pragma comment( linker, "/subsystem:Console" )
int main()
{
cout << "Hello main() _CONSOLE" << endl;
cout << endl;
return 0;
}
_stdcall WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello Win32 WinMain", "", MB_OK);
return 0;
}