我可以使用宏来切换项目类型吗?

时间:2016-09-28 12:05:06

标签: c++ macros

根据处理器的不同,我会看到为每个项目定义的宏。所以,在控制台中,它是_CONSOLE,在 Win32 ,它是_WIN32

当我用IDE打开源文件(.cpp)时,我默认得到控制台环境。

  • 可以使用宏切换到win32或mfc,例如:

    #ifdef _CONSOLE
    #undef _CONSOLE
    #define _WIN32
    #endif
    

所以我希望编译器询问WinMain()而不是main()

3 个答案:

答案 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;
}