C ++编译时间宏来检测windows os

时间:2012-04-11 18:46:43

标签: c++ windows windows-7 header preprocessor-directive

是否存在任何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 

还有其他更好的方法吗?

5 个答案:

答案 0 :(得分:10)

它正在编译的操作系统并不是那么重要;更重要的是代码运行的操作系统,你显然无法在编译时检测到它。但是,如果您希望代码在较旧版本的Windows上运行,则可以将WINVER and _WIN32_WINNT设置为某些值,这将导致较新的功能无法使用等等。(只需在Windows头文件中搜索这些宏的测试位置)得到一个想法)。

要在运行时测试功能,请使用GetProcAddress(以及可能还有LoadLibrary(如果它位于较新的DLL中)以测试该功能是否可用。如果是,请拨打电话,如果没有,请不要。

如果要检测编译器版本等,另请参阅Visual Studio编译器使用的predefined macros

答案 1 :(得分:1)

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

答案 2 :(得分:0)

至少对于MS VC ++,WIN32,_WIN32和_WIN32_WINNT,对于初学者来说。除非您需要在编译时控制它,否则您可能会考虑使用类似GetVersionEx的东西在运行时进行检测,因此相同的构建在旧版本上运行,但在新功能可用时会利用它们。

答案 3 :(得分:0)

某些事情确实需要在编译时知道哪个OS版本。

例如import "winhttp.dll"将在Windows 7下编译,但在Windows 10下导致编译时错误(C1083)。

但是,如果您切换到import "winhttpcom.dll"。它可以在Windows 10下编译,但在Windows 7下失败。

因此,这里需要一个OS宏才能导入适当的dll。

答案 4 :(得分:-1)

对于想要在我的案例中在Visual Studio(2017)下编译/包含CONSOLE和WIN32 App之间不同的人,我只需花两美分。

您使用向导创建控制台应用程序,您将拥有:

WIN32; _DEBUG; _CONSOLE;%(PreprocessorDefinitions)

下: enter image description here

如果您使用向导 win32 GUI A pp:

WIN32; _DEBUG; _WINDOWS;%(PreprocessorDefinitions) 所以没有_CONSOLE。

enter image description here

所以你可以写:

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


#endif // _CONSOLE



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


#endif // _CONSOLE


    return 0;
}