c# 中使用的“#if”指令是啥,“符号”代表啥?

Posted

技术标签:

【中文标题】c# 中使用的“#if”指令是啥,“符号”代表啥?【英文标题】: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),由于这个词的广泛含义,我正在努力寻找答案。

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

【问题讨论】:

这些是预处理器指令 这对您有帮助吗:***.com/questions/2355340/…? 【参考方案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 指令的代码中

【讨论】:

以上是关于c# 中使用的“#if”指令是啥,“符号”代表啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# 十进制文字符号中的 M 代表啥?

unit是啥数据类型?C#中

在汇编语言中变量的名字代表啥?

这几个泛型符号都是啥意思?

c# 有啥预定义的#if 符号?

€ 这个是啥意思 怎么读?