2008-08-19 45 views
15

我想知道关于实例发送时使用#define和#if语句。我已经知道了一段时间,但从来没有将其纳入我的编码方式。这究竟如何影响编译?你如何使用#define?

#define是唯一确定编译时是否包含代码的东西?如果我将#define DEBUGme作为自定义符号,将其从编译中排除的唯一方法是删除此#define语句?

回答

12

在C##define宏中,像Bernard的一些例子一样,是不允许的。 C#中#define/#if的唯一常见用途是添加可选的仅调试代码。例如:

 static void Main(string[] args) 
     { 
#if DEBUG 
      //this only compiles if in DEBUG 
      Console.WriteLine("DEBUG") 
#endif 
#if !DEBUG 
      //this only compiles if not in DEBUG 
      Console.WriteLine("RELEASE") 
#endif 
      //This always compiles 
      Console.ReadLine() 
     } 
1

好吧,定义常用于编译时常量和宏。这可以使你的代码更快一点,因为没有函数调用,宏的输出值是在编译时确定的。 #if是非常有用的。我能想到的最简单的例子是检查调试版本以添加一些额外的日志记录或消息传递,甚至可能有一些调试功能。你也可以用这种方法检查不同的环境变量。

其他具有更多C/C++经验的人可以添加更多我相信。

1

我经常发现自己定义了某些在某些功能中重复完成的事情。这使得代码更短,从而可以更好地浏览。

但是和往常一样,试着找到一个很好的方法来不创建一种新的语言。在稍后的日常维护中可能有点难以阅读。

8

#define用于定义编译时常量,您可以使用#if来包含或排除代码位。

#define USEFOREACH 

#if USEFOREACH 
    foreach(var item in items) 
    { 
#else 
    for(int i=0; i < items.Length; ++i) 
    { var item = items[i]; //take item 
#endif 

     doSomethingWithItem(item); 
    } 
1

@Ed:当使用C++时,在创建宏时使用#define over inline函数几乎没有任何好处。 “更大速度”的想法是一种误解。使用内联函数可以获得相同的速度,但是由于在调用函数之前计算参数,因此您也可以获得类型安全性,并且不会产生预处理器“粘贴”的副作用(例如,尝试编写无处不在的MAX宏,并像这样调用它:MAX(x ++,y)..你会看到我在得到什么)。

我从来没有在我的C#中使用#define,而且我很少将它用于其他平台和编译器版本检查C++中的条件编译。

3

是#define唯一的东西 确定是否包含代码 编译时?如果我将#define 作为自定义符号DEBUGme,唯一的 方法将其从编译中排除到 删除此#define语句?

您可以undefine符号以及

#if defined(DEBUG) 
#undef DEBUG 
#endif 
0

或许在C#中的#define最常见的usees是调试/释放,并在不同的平台(例如Windows和X-Box的360区分XNA框架)。

0

这是条件编译,这样你就可以包括或删除基于项目属性,这往往是代码位:

  • 意平台(Windows/Linux的/ XB360/PS3/iPhone等.... )
  • Release或Debug(一般记录,断言等只包括在调试版本)

他们还可以使用游戏的开发过程中快速禁用系统的大部分地区, 例如, ,我可能会定义

#define PLAYSOUNDS 

,然后包装最终呼叫播放声音:

#ifdef PLAYSOUNDS 
// Do lots of funk to play a sound 
return true; 
#else 
return true; 

所以它很容易让我打开和关闭声音的播放的版本。 (通常我在调试时不会播放声音,因为它妨碍了我的个人音乐:)) 好处是您不会通过添加if语句来引入分支....