2016-04-21 56 views
1

我努力学习预处理指令,所以我做了一个简单的例子是这样的:预处理指令不可能定义或取消定义预处理

using System; 

namespace learning 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
#define DEBUG 
      test(); 
     } 

     private void test() 
     { 
#if DEBUG 
      Console.WriteLine("Debug mode"); 
#elif RELEASE 
      Console.WriteLine("Release mode"); 
#else 
      Console.WriteLine("Debug and release don't defined"); 
#endif 
     } 

    } 
} 

,但我遗憾的是这个错误:

Impossible to define or cancel defining the preprocessor symbols after the first token in the file

我从一本编程书籍中拿这个例子,有什么不对?

更新(我的溶液):

#define RELEASE 
using System; 

namespace learning 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
#if DEBUG 
      Console.WriteLine("Debug mode"); 
#elif RELEASE 
      Console.WriteLine("Release mode"); 
#else 
      Console.WriteLine("Debug and release don't defined"); 
#endif 
      Console.ReadLine(); 
     } 

    } 
} 

打印结果:Debug mode,但应该是Release mode。我做错了什么?

+1

将#define DEBUG放在文件的开头。 – neo

+0

这本书是错误的,基本上。它是哪本书?名字和耻辱...(我真的希望它不是我的...) –

+0

@JonSkeet http://antoniopelleriti.it/page/libro-csharp – Dillinger

回答

4

作为新之前提到的,你可以在你的文件的顶部定义它。或者,如果你希望它是全局的,并且你正在使用Visual Studio,你可以在你的项目属性中定义它(右键单击项目,选择Properties,然后进入Build选项卡)。

该屏幕将允许您根据构建配置定义符号(因此您可以为调试构建设置符号并在切换配置时自动删除它)。

如果您不使用Visual Studio,则可以将条件符号传递给MSBuild或csc(命令行编译或命令行c#编译器)。所有这些选项都可以让您在不更改源代码的情况下设置/取消设置符号。

+0

明白了,但可以定义更多的符号? – Dillinger

+0

@Dillinger:您可以在每个文件的开头以及项目设置中定义任意数量的符号。进入“普通”代码后,您无法定义更多符号。 –

+0

是的,你可以根据需要定义多个 - 只需将它们放入Build选项卡中的“Conditional Compilation symbols”中。 – JMarsch

2

你需要把#define线在文件的最开始,using陈述

+0

哦,这本书没有任何反驳。我现在明白了。但是我已经更新了'#define RELEASE'的例子,为什么编译器会打印我:'Debug mode'而不是'Release mode'? – Dillinger

+0

@Dillinger:我的猜测是你在Visual Studio中以调试配置构建它,其中DEBUG已经在项目设置中定义。 –

+0

查看下面的答案,但除了调试符号之外,还可以构建配置。这允许您设置一组选项,并让它们适用于特定的配置。例如,默认情况下,您在创建项目时将获得“调试”和“发布”配置。调试启用了DEBUG符号,并关闭了编译器优化。发布打开编译优化(还有其他差异)。查看配置管理器(右键单击解决方案)。 – JMarsch