【问题标题】:Whats the point of #define? [duplicate]#define 的意义何在? [复制]
【发布时间】:2014-04-02 06:56:09
【问题描述】:

它们必须放在 .cs 文件的顶部。你不能在运行时动态创建这些家伙,你不能给他们一个值或改变他们的值,因为根本没有价值,那么#define 关键字的意义何在?

这是一个例子:

#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}

两者都在顶部定义,那么为什么还要使用所有这些 if?

谁能告诉我define在哪些场景有用?

对不起,如果这是重复的,请在 cmets 中告诉我,如果是这样,我会删除这个问题。

【问题讨论】:

    标签: c#


    【解决方案1】:

    重点是条件编译

    喜欢:

    #ifdef x64     
    .... 
    #else
    ....
    #endif
    
    
    #ifdef KIOSK
       fullScreen  =true; 
    #else
       fullScreen  =false;
    #endif 
    

    你为编译时间创造条件,所以你的二进制文件在运行时不会改变,但是 将符合您正在编译的目标环境的确切要求。它可以是您想要的任何东西,由您决定#define 的名称和语义

    编辑

    示例:您有一个访问低级 Windows API 的程序,并且您必须支持 x86 和 x64 版本。在这种情况下,您可能希望在 32 位程序的 二进制文件 中(因此在编译后),没有任何 64 位函数的证据。所以你可以写

    #ifdef x64 //conditional compilation symbol defined by YOU 
       DriverInfo GetDriverInfo64(..) {...} //64bit 
    #else
       DriverInfo GetDriverInfo(..) {...}   //32bit
    #endif
    

    【讨论】:

    • 如果您必须在顶部定义它们,那么对于每个编译它们都会在那里。它们是硬编码的。那么那里的条件是什么意思?
    • 如何回答这个问题?当然,您展示了预处理器使用的示例...但这不是问题。我真的很困惑它在这么短的时间内得到了这么多的支持。
    • 你没有。您还可以在项目属性中定义它们,具体取决于您拥有的是编译版本还是发布版本。
    • 你可以在一个定义的情况下声明一个函数,在其他条件编译中可能会错过。从二进制文件中丢失。例如 x64 条件:如果您为 32 位编译,您可能希望您的 dll 没有任何 64 位目标 API 函数。 那是您使用#define 的地方
    • @dev Hedgehog:在您的示例中,它们是硬编码的,但您也可以在项目设置中定义它们或作为编译器的参数。例如,DEBUG 在使用调试构建设置时在 VS 中自动定义。因此,您可以在编译时包含/排除代码。
    【解决方案2】:

    您不需要使用#define 定义这些符号,您可以在项目设置中或每个编译器参数中全局设置它们。但有时当您可以更改单个文件的符号值(设置/取消设置)以进行测试或调试时,它会派上用场。那么#define 将成为你的朋友 :)

    【讨论】:

    • 啊,好吧,我以前不知道。这是有道理的。 :)
    【解决方案3】:

    您应该删除顶部的两个#define 语句。如果您使用 Visual Studio 进行编译,则可以选择是否打开调试。如果你打开调试,编译器会知道你的代码中有哪些部分,哪些部分可以省略。

    假设您开启了 DEBUG,您的代码将如下所示:

    using System;
    public class MyClass 
    {
        static void Main() 
        {
            Console.WriteLine("DEBUG is defined");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-09
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多