你如何使用#define?

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

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

在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() } 

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

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

您也可以取消定义符号

 #if defined(DEBUG) #undef DEBUG #endif 

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

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

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

但是一如既往,试着找到一个好的方法,不要用它来创造新的语言。 以后偶尔进行维护可能会有点难以阅读。

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

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

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

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

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

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

 #define PLAYSOUNDS 

然后包装最后的调用以播放声音:

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

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