繁体   English   中英

有关预处理器指令的问题

[英]Question on preprocessor directives

如果我使用预处理器指令来定义操作系统将运行的代码,如下所示:

     #if winXP // Compiling for Windows XP
    platformName = "Microsoft Windows XP";
    #elif win2000 // Compiling for Windows 2000
    platformName = "Microsoft Windows 2000";
    #elif win7 // Compiling for Windows 7
    platformName = "Microsoft Windows 7";
    #else // Unknown platform specified
    platformName = "Unknown";

系统如何选择使用哪个操作系统?

这是《 Visual C#2010食谱》一书中的示例,其中作者说platformName变量(省略了声明)等同于上述OS。

谢谢

编译器看不到'#if'和'#elif'(else-if),但预处理器看不到,而编译器只能看到这四行'platformName ='。 一个不存在,其中一个或多个决定是否编译:

#define winXP
#define win2000
#define win7

或者,通过在编译器命令行上指定“ / D”。 您可以定义多个,只编译if / elif序列中的第一个匹配项。

为什么这样

好吧,Win32 API多年来发展了,新版本的API具有早期版本所没有的功能。 此外,某些API函数的行为会因操作系统版本而略有不同。

它不仅会比较给定版本名称(winXP,win7等)所隐含的版本号,还会与当前系统的版本号进行比较吗?

同样,您必须在预处理器中定义在预处理器中检查的值(win7,winXP,win2000等)。

通过#define winXP (可能对您没有帮助)或通过您的构建系统(例如,在MSBuild中,请尝试在/p:DefineConstants=WinXP )在源文件中显式显示。 请注意,在这种情况下,您必须重新编译以启用/禁用这些值。 顺便说一句,这就是#if DEBUG类的语句,它通过在设置DEBUG常量的配置中进行编译而变得有用。

如果您想知道如何在运行时确定操作系统,请查看System.Environment.OSVersionSystem.PlatformID枚举。

如果需要检测操作系统版本,可以使用Environment.OSVersion 尽管它是运行时检查,但我更喜欢使用给定的.NET框架抽象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM