[英]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.OSVersion
和System.PlatformID
枚举。
如果需要检测操作系统版本,可以使用Environment.OSVersion 。 尽管它是运行时检查,但我更喜欢使用给定的.NET框架抽象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.