[英]C++ compile time macros to detect windows os
是否存在任何 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
还有其他更好的方法吗?
编译它的操作系统并不是那么重要; 更重要的是运行代码的操作系统,您显然无法在编译时检测到它。 但是如果你想让你的代码在旧版本的 Windows 上运行,你可以将WINVER
和_WIN32_WINNT
设置为某些值,这将导致较新的函数不可用等(只需在 Windows 头文件中搜索这些宏的测试位置即可获得一个想法)。
要在运行时测试功能,请使用GetProcAddress
(如果它在较新的 DLL 中,也可能使用LoadLibrary
)来测试该函数是否可用。 如果是,就打电话,如果不是,就不要。
如果要检测编译器版本等,另请参阅 Visual Studio 编译器使用的预定义宏。
有一组标准的Windows 标题宏可以告诉您操作系统的确切版本
对于初学者来说,至少使用 MS VC++、WIN32、_WIN32 和 _WIN32_WINNT。 除非您需要在编译时对其进行控制,否则您可能会考虑使用 GetVersionEx 之类的东西在运行时进行检测,因此相同的构建可以在旧版本上运行,但会在新功能可用时利用它们。
有些事情确实需要在编译时知道哪个操作系统版本。
例如import "winhttp.dll"
在 Windows 7 下会编译,但在 Windows 10 下会导致编译时错误 (C1083)。
但是如果你切换到import "winhttpcom.dll"
。 它会在 Windows 10 下编译,但在 Windows 7 下会失败。
所以这里需要一个 OS 宏来导入适当的 dll。
对于想要在 Visual Studio (2017) 下在 CONSOLE 和 WIN32 App 之间编译/包含不同的人,我的两分钱。
您使用向导创建控制台应用程序,您将拥有:
WIN32;_DEBUG;_CONSOLE;%(预处理器定义)
如果您使用win32 GUI A应用程序向导:
WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) 所以没有 _CONSOLE。
所以你可以写:
#ifdef _CONSOLE
// for Console
#else
// for GUI
#endif // _CONSOLE
int main()
{
#ifdef _CONSOLE
// for Console
#else
// for GUI
#endif // _CONSOLE
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.