是否存在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
有没有其他更好的办法?
6条答案
按热度按时间9udxz4iz1#
它被编译的操作系统并不是那么重要;更重要的是运行代码的操作系统,显然你在编译时无法检测到它。但是如果你想让你的代码在旧版本的Windows上运行,你可以设置
WINVER
和_WIN32_WINNT
为特定的值,这将导致更新的函数不可用等等。(只要搜索Windows头文件,了解这些宏在哪里进行测试就可以了)。要在运行时测试功能,请使用
GetProcAddress
(如果LoadLibrary
在较新的DLL中,也可以使用LoadLibrary
)测试函数是否可用。如果要检测编译器版本等,请参见Visual Studio编译器使用的predefined macros。
iyfamqjs2#
有一组标准的windows header macros可以告诉您操作系统的确切版本
smdnsysy3#
有些事情确实需要在编译时知道操作系统的版本。
例如,
import "winhttp.dll"
将在Windows 7下编译,但在Windows 10下导致编译时错误(C1083)。但是如果你切换到
import "winhttpcom.dll"
。它会在Windows 10下编译,但在Windows 7下失败。因此,这里需要一个OS宏来导入适当的dll。
vddsk6oq4#
至少对于MS VC++、WIN32、_WIN32和_WIN32_WINNT来说是这样的,除非你需要在编译时控制它,否则你可以考虑使用像GetVersionEx这样的东西在运行时检测,这样同样的构建可以在旧版本上运行,但是可以利用新的特性。
7vhp5slm5#
我的答复是10年后,但张贴在即将到来的岁月的答案。
可使用c/c++编译器版本检测版本。合适的宏如下所述:
参考:MS macros
mw3dktmi6#
我的两分钱给那些想要在Visual Studio(2017)下编译/包含不同的控制台和WIN32应用程序的人。
使用向导创建控制台应用程序时,您将拥有:
WIN32;_调试;_CONSOLE;%(预处理器定义)
下:x1c 0d1x
如果您将向导用于win32 GUI App:
WIN32;_调试;_WINDOWS;%(预处理器定义),因此没有控制台。
所以你可以写: