【问题标题】:How do you use #define?你如何使用#define?
【发布时间】:2010-09-06 03:45:02
【问题描述】:

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

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        您也可以undefine 符号

        #if defined(DEBUG)
        #undef DEBUG
        #endif
        

        【讨论】:

        • #if defined(X) 可能不再有效(至少它没有在 Visual Studio 2019 中为我编译,使用 C# 8.0!)。您仍然可以这样做,只需将第一行更改为#if DEBUG
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          但与往常一样,请尝试找到一种好的方法来避免使用它来创建新语言。以后偶尔进行维护可能有点难以阅读。

          【讨论】:

            【解决方案6】:

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

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

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

            #define PLAYSOUNDS
            

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

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

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

            【讨论】:

              【解决方案7】:

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

              我从未在我的 C# 中使用过#define,而且我很少将它用于除平台和编译器版本检查以在 C++ 中进行条件编译之外的任何事情。

              【讨论】:

              • #define 的主要用例是条件编译(它可能非常有用)。您是正确的,将 #define 用于符号和(请不要这样做)宏不是一个好的用例。
              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-07-30
                • 1970-01-01
                • 1970-01-01
                • 2014-08-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多