首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 技术专题 | 电子书下载 | 教学视频 | 网页设计 | 平面设计 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 文章正文

展现C#世界之九:配置和调度

文章来源ChinaItLab 作者佚名 更新时间2007-11-29 保存本文保存本文 推荐给好友推荐给好友 收藏本页收藏本页

  清单 9.2 使用#elif 在#if标志中创建多个分支

  1: // #define DEBUG

  2: #define RELEASE

  3: #define DEMOVERSION

  4:

  5: #if DEBUG

  6: #undef DEMOVERSION

  7: #endif

  8:

  9: using System;

  10:

  11: class Demo

  12: {

  13: public static void Main()

  14: {

  15: #if DEBUG

  16: Console.WriteLine("Debug version");

  17: #elif RELEASE && !DEMOVERSION

  18: Console.WriteLine("Full release version");

  19: #else

  20: Console.WriteLine("Demo version");

  21: #endif

  22: }

  23: }

  在这个"if标志:符号:包含代码"例子中,所有的符号都在C#源文件中被定义。注意第6行#undef语句增加的那部分。

  由于不编译DEBUG代码的DEMO版本(任意选择),我确信它不会被某些人无意中定义了,而且总当DEBUG被定义时,就取消DEMO版本的定义。

  接着在第15~21行,预处理符号被用来包括各种代码。注意#elif标志的用法,它允许你把多个分支加到#if 标志。该代码运用逻辑操作符"&&"和非操作符"!".也可能用到逻辑操作符"||",以及等于和不等于操作符。

  9.1.1.3 引起错误并警告

  另一种可能的"警告 标志错误 标志"预处理标志的使用,是依据某些符号(或根本不依据,如果你这样决定)引起错误或警告。各自的标志分别为 #warning和#error,而清单9.3 演示了如何在你的代码中使用它们。

  清单 9.3 使用预处理标志创建编译警告和错误

  1: #define DEBUG

  2: #define RELEASE

  3: #define DEMOVERSION

  4:

  5: #if DEMOVERSION && !DEBUG

  6: #warning You are building a demo version

  7: #endif

  8:

  9: #if DEBUG && DEMOVERSION

  10: #error You cannot build a debug demo version

  11: #endif

  12:

  13: using System;

  14:

  15: class Demo

  16: {

  17: public static void Main()

  18: {

  19: Console.WriteLine("Demo application");

  20: }

  21: }

  在这个例子中,当你生成一个不是DEBUG版本的DEMO版本时,就发出了一个编译警告(第5行~第7行)。当你企图生成一个DEBUG DEMO版本时,就引起了一个错误,它阻止了可执行文件的生成。对比起前面只是取消定义令人讨厌的符号的例子,这些代码告诉你,"警告 标志错误 标志"企图要做的工作被认为是错误的。这肯定是更好的处理办法。

  9.1.1.4 条件属性

  C++的预处理也许最经常被用来定义宏,宏可以解决一种程序生成时的函数调用,而却不能解决另一种程序生成时的任何问题。这些例子包括 ASSERT和TRACE 宏,当定义了DEBUG符号时,它们对函数调用求值,当生成一个RELEASE版本时,求值没有任何结果。

  当了解到宏不被支持时,你也许会猜测,条件功能已经消亡了。幸亏我可以报道,不存在这种情况。你可以利用条件属性,依据某些已定义符号来包括方法。:

  [conditional("DEBUG")]

  public void SomeMethod() { }

  仅当符号DEBUG被定义时,这个方法被加到可执行文件。并且调用它,就象

  SomeMethod();

  当该方法不被包括时,它也被编译器声明。功能基本上和使用C++条件宏相同。

  在例子开始之前,我想指出,条件方法必须具有void的返回类型,不允许其它返回类型。然而,你可以传递你想使用的任何参数。

  在清单9.4 中的例子演示了如何使用条件属性重新生成具有C++的TRACE宏一样的功能。为简单起见,结果直接输出到屏幕。你也可以根据需要把它定向到任何地方,包括一个文件。

上一页  [1] [2] [3] [4] [5] 下一页  

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 社区讨论
 博客论点
 Dotnet频道相关导航