你如何使用#define?

时间:2008-08-19 05:16:35

标签: c#

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

  

#define是唯一决定编译时是否包含代码的东西吗?如果我将#define DEBUGme作为自定义符号,那么从编译中排除它的唯一方法是删除这个#define语句吗?

8 个答案:

答案 0 :(得分:13)

在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 :(得分:9)

#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);
     }

答案 2 :(得分:3)

  

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

您也可以undefine个符号

#if defined(DEBUG)
#undef DEBUG
#endif

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

但与往常一样,试图找到一个好的措施,不要用它来创造一种新的语言。以后偶尔进行维护可能会有点难以阅读。

答案 5 :(得分:1)

@Ed:使用C ++时,在创建宏时使用#define而不是内联函数几乎没有任何好处。 “更快速度”的想法是一种误解。使用内联函数可以获得相同的速度,但是您也可以获得类型安全,并且由于在调用函数之前评估参数这一事实,预处理器没有“粘贴”的副作用(例如,尝试编写无处不在的MAX宏) ,并称之为:MAX(x ++,y)..你会看到我得到的东西。)

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

答案 6 :(得分:0)

在C#中#define最常见的用途可能是区分调试/发布和不同的平台(例如XNA框架中的Windows和X-Box 360)。

答案 7 :(得分:0)

它适用于条件编译,因此您可以根据项目属性包含或删除代码位:

  • 预期平台(Windows / Linux / XB360 / PS3 / Iphone等)
  • 发布或调试(通常日志记录,断言等仅包含在调试版本中)

它们还可用于快速禁用系统的大部分, 例如,在开发游戏期间,我可能会定义

#define PLAYSOUNDS

然后打包最后一个调用以播放声音:

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

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