please define #define
本文关键字:#define define please | 更新日期: 2023-09-27 18:05:12
有人能给我一些例子如何使用#define在c#?
#define //preprocessor directive
目的是什么?以下是来自微软的例子,我仍然不明白:
// preprocessor_if.cs
#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
}
}
"Preprocessor"意味着它生成的结果在编译器进行主处理之前完成。它的主要用途之一是在编译文件之前包含或排除文件中的代码。
在您看到的示例中,预处理器将首先#define
这两个符号,然后计算不同的#if/#elif
语句,以确定哪些代码实际上应该在文件中结束。在本例中,这两个符号都被定义了,因此只输出表示这样的那一行,并且只编译那一行代码。如果要对结果进行反编译,则只会看到一条 Console.WriteLine()
语句,而不会看到其他语句。
Quote:
#define和#undef应该出现在源代码的最顶部文本文件,他们可以调整整个文件的编译选项。
和
在c#语言中,#define行被认为是预处理指令。对于已定义的符号有一些无效的语法;你不能使用数字值作为定义的标识符,例如。
和
#undef指令确保在文件中的文本点之后,指定的标识符没有定义。
在您的示例中,如果定义了DEBUG
(只要定义了它是什么并不重要)并且没有定义MYTEST,那么它将显示所示的消息。
否则,如果没有定义DEBUG
,但定义了MYTEST,那么它将显示所示的消息。
如果两者都定义了,那么它将显示所显示的消息。
底线:
定义的要点是有选择地对程序应用编译选项,以给它一个不同的程序流。
阅读预处理器指令。我写c++,所以我用的方式和你不完全一样,但基本上这些是你在执行语句之前定义的东西。通常它们有两种用法。1)。在第一个函数运行之前定义一些东西,例如,你可以在主函数中将pie作为变量调用之前定义pie的数值。2)。
#define
是c#中一个特殊的"before compile"指令(它派生自旧的CPP指令),它定义了一个预处理器符号。
与#if
结合,根据定义的符号,各种代码将被有效地注释掉。正因为如此,非选择路径中的代码甚至不需要处于可编译状态!
在上面的例子中,符号DEBUG
和MYTEST
是在顶部手动定义的(与#define
一起),因此当代码开始"正常"编译阶段时,代码"看起来像"如下:(在c#中,此预处理是编译器的一部分,而不是首先运行的单独工具)
// preprocessor_if.cs
//#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
}
}
DEBUG
符号通常是自动设置的,这取决于是否为调试而构建项目,其他符号可以设置为项目本身的一部分。
快乐编码。
预处理器指令将在编译时计算。#define指令是用来声明一个可以在编译时求值的变量。
#if (DEBUG && !MYTEST)
Console.WriteLine("DEBUG is defined");
#endif
上面的行不会被编译,因为DEBUG和MYTEST是在文件开头定义的。