【问题标题】:What is "#if" directive used for in c# and what "symbols" stand for?c# 中使用的“#if”指令是什么,“符号”代表什么?
【发布时间】:2019-04-01 07:39:56
【问题描述】:

我试图了解#if 语句在 C# 上的工作原理以及它的使用方式。

看完some documentation我得出的结论是,如果定义了条件中的“符号”,它就是用来编译其中的代码的。

#if DEBUG
    Console.WriteLine("Debug version");
#endif

这里的问题是我不知道他们所说的“符号”是什么意思(在这种情况下,DEBUG),由于这个词的广泛含义,我正在努力寻找答案。

这些“符号”是什么?这些“预处理器指令”的目的是什么?

【问题讨论】:

标签: c# .net preprocessor-directive


【解决方案1】:

正如人们已经说过的,它是一个预处理器指令。 #if DEBUG ... #endif 中的代码将有条件地编译,这取决于符号 DEBUG 是否已定义。

在这种情况下,DEBUG 只是为预处理器专门引入的一个符号名称,以便它可以区分应该或不应该编译的代码块。

您可以在项目设置中定义一个新的预处理器符号:

这里,我们一共定义了四个符号:

  • DEBUG
  • TRACE
  • ANOTHER_SYMBOL
  • YET_ANOTHER_SYMBOL

DEBUGTRACE 有点特别,因为它们非常普遍。这就是为什么他们有专门的复选框。这里的术语“常数”与术语“符号”互换使用。但是,在这种特定情况下,我更频繁地听到“符号”。

另一种定义符号的方法是通过代码。您可以在 .cs 源文件的最开头添加#define 指令

#define YET_ANOTHER_SYMBOL

【讨论】:

  • 使用项目属性的一个优点是您可以为“发布”和“调试”构建配置使用不同的符号。
【解决方案2】:

这些是预处理器指令。在您的情况下,它将检查 DEBUG 符号是否定义为 #define DEBUG 然后代码段 Console.WriteLine 将被执行

#if DEBUG
    Console.WriteLine("Debug version");
#endif

【讨论】:

  • 问题似乎不是指令实际上是什么,而是在这种情况下 symbol 是什么。
【解决方案3】:

正如您已经假设的那样,DEBUG-symbol 被编译器使用 来翻译或不翻译代码。因此,在发布版本中 - DEBUG 不存在 - 代码不会编译到 IL 中。

这里的符号表示引入编译器的变量。这些是在 VS Project Properties-->Build-->conditional complation symbols 中定义的。但是存在一组预定义的符号 - 例如DEBUG

【讨论】:

    【解决方案4】:

    除了预定义的,你还可以在文件级别或者项目级别定义自己的条件编译符号:

    https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.conditionalattribute?redirectedfrom=MSDN&view=netframework-4.7.2

    例如,在文件开头键入这个来定义“CONDITION1”

    #define CONDITION1
    

    或者在项目属性-->build-->条件编译符号下定义。 在这里您还可以看到预定义的“调试”和“跟踪”常量(如果检查了您的配置)。

    【讨论】:

      【解决方案5】:

      在此上下文中的“符号”表示称为“条件编译符号”的标识符,仅对#if 指令有用。

      你可以设置它们:

      • 在 VS 中来自 Project properties->build->条件编译符号(如 @HimBromBreere 所写)请注意,常用的 DEBUG 和 TRACE 符号有复选框
      • 从带有 -define 选项的编译器命令行
      • 在带有#define 指令的代码中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 2010-09-09
        • 2010-09-06
        • 1970-01-01
        • 2011-02-17
        • 2011-02-20
        • 1970-01-01
        相关资源
        最近更新 更多