用于检测Windows操作系统的C++编译时宏

hof1towb  于 2023-01-10  发布在  Windows
关注(0)|答案(6)|浏览(194)

是否存在C++编译时宏,用于检测代码在哪个Windows操作系统上编译。我基本上只想在Win7上支持某些函数。因此,我对这样做很感兴趣

#if <os_macro> = WIN7
  // This function would do something valid only on Win7 builds.
  bool myfunction {
        // do something here
  }
#else
  // This function would typically return false, since its not supported on OS below win7
  bool myfunction {
       return false;
  }
#endif

有没有其他更好的办法?

9udxz4iz

9udxz4iz1#

它被编译的操作系统并不是那么重要;更重要的是运行代码的操作系统,显然你在编译时无法检测到它。但是如果你想让你的代码在旧版本的Windows上运行,你可以设置WINVER_WIN32_WINNT为特定的值,这将导致更新的函数不可用等等。(只要搜索Windows头文件,了解这些宏在哪里进行测试就可以了)。
要在运行时测试功能,请使用GetProcAddress(如果LoadLibrary在较新的DLL中,也可以使用LoadLibrary)测试函数是否可用。
如果要检测编译器版本等,请参见Visual Studio编译器使用的predefined macros

iyfamqjs

iyfamqjs2#

有一组标准的windows header macros可以告诉您操作系统的确切版本

smdnsysy

smdnsysy3#

有些事情确实需要在编译时知道操作系统的版本。
例如,import "winhttp.dll"将在Windows 7下编译,但在Windows 10下导致编译时错误(C1083)。
但是如果你切换到import "winhttpcom.dll"。它会在Windows 10下编译,但在Windows 7下失败。
因此,这里需要一个OS宏来导入适当的dll。

vddsk6oq

vddsk6oq4#

至少对于MS VC++、WIN32、_WIN32和_WIN32_WINNT来说是这样的,除非你需要在编译时控制它,否则你可以考虑使用像GetVersionEx这样的东西在运行时检测,这样同样的构建可以在旧版本上运行,但是可以利用新的特性。

7vhp5slm

7vhp5slm5#

我的答复是10年后,但张贴在即将到来的岁月的答案。
可使用c/c++编译器版本检测版本。合适的宏如下所述:

_MSC_VER 

_MSC_FULL_VER

参考:MS macros

mw3dktmi

mw3dktmi6#

我的两分钱给那些想要在Visual Studio(2017)下编译/包含不同的控制台和WIN32应用程序的人。
使用向导创建控制台应用程序时,您将拥有:
WIN32;_调试;_CONSOLE;%(预处理器定义)
下:x1c 0d1x
如果您将向导用于win32 GUI App:
WIN32;_调试;_WINDOWS;%(预处理器定义),因此没有控制台。

所以你可以写:

#ifdef _CONSOLE
// for Console
#else
// for GUI

#endif // _CONSOLE


int main()
{
#ifdef _CONSOLE
    // for Console
#else
    // for GUI

#endif // _CONSOLE

    return 0;
}

相关问题