2014-04-02 55 views
1

它们必须放在.cs文件的顶部。你不能在运行时动态地创建这些人,你不能给他们一个价值或改变他们的价值,因为根本没有价值,所以#define关键字是什么意思?#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 
    } 
} 

所以为什么有反正所有的IFS两者都在上面定义的?

有人可以告诉我情况哪里定义是有用的?

对不起,如果这是一个重复只是让我知道如果是这样的意见,我会删除这个问题。

回答

6

关键是条件compialtion

像:

#ifdef x64  
.... 
#else 
.... 
#endif 


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

您创建编译时状态,这样你的二进制文件不会在运行时改变,但 会适合你正在编译for.It可能是您的目标环境的具体要求什么你想,这取决于你的名字和语义#define

编辑

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

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

如果非要定义它们之上则每个编译他们会在那里。它们是硬编码的。那么你在那里有条件是什么意思? –

+0

这是如何回答这个问题的?当然,你会展示预处理器使用的例子......但这不是问题**。我真的很困惑,它在这么短的时间内得到了很多赞扬。 –

+0

你没有。您也可以在项目属性中定义它们,具体取决于您是否拥有编译版本或发行版本。 – TomTom

0

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

+0

Ahhh好吧我以前不知道这个。这是有道理的。 :) –

0

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

假设你有DEBUG打开,您的代码如下:

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