Csharp/C Sharp/Language Basics/Preprocessor Directives — различия между версиями

Материал из .Net Framework эксперт
Перейти к: навигация, поиск
м (1 версия)
 
(нет различий)

Текущая версия на 11:39, 26 мая 2010

#define, #if, and #endif preprocessor directives

/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
  Example4_16.cs illustrates the use of the
  #define, #if, and #endif preprocessor directives
*/
#define DEBUG
public class Example4_16
{
  public static void Main()
  {
    int total = 0;
    int counter = 0;
    myLabel:
    counter++;
    total += counter;
    System.Console.WriteLine("counter = " + counter);
    if (counter < 5)
    {
#if DEBUG
      System.Console.WriteLine("goto myLabel");
#endif
      goto myLabel;
    }
    System.Console.WriteLine("total = " + total);
  }
}


Demonstrate #elif

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Demonstrate #elif. 
 
#define RELEASE 
 
using System; 
 
public class Test5 { 
  public static void Main() { 
     
    #if EXPERIMENTAL 
      Console.WriteLine("Compiled for experimental version."); 
    #elif RELEASE 
      Console.WriteLine("Compiled for release."); 
    #else 
      Console.WriteLine("Compiled for internal testing."); 
    #endif 
 
    #if TRIAL && !RELEASE 
       Console.WriteLine("Trial version."); 
    #endif 
   
    Console.WriteLine("This is in all versions."); 
  } 
}


Demonstrate #else

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Demonstrate #else. 
 
#define EXPERIMENTAL 
 
using System; 
 
public class Test4 { 
  public static void Main() { 
     
    #if EXPERIMENTAL 
      Console.WriteLine("Compiled for experimental version."); 
    #else 
      Console.WriteLine("Compiled for release."); 
    #endif 
 
    #if EXPERIMENTAL && TRIAL 
       Console.Error.WriteLine("Testing experimental trial version."); 
    #else 
       Console.Error.WriteLine("Not experimental trial version."); 
    #endif 
   
    Console.WriteLine("This is in all versions."); 
  } 
}


Demonstrate #if, #endif, and #define

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Demonstrate #if, #endif, and #define. 
 
#define EXPERIMENTAL 
 
using System; 
 
public class Test1 { 
  public static void Main() { 
     
    #if EXPERIMENTAL 
      Console.WriteLine("Compiled for experimental version."); 
    #endif 
   
    Console.WriteLine("This is in all versions."); 
  } 
}


Demonstrates the use of a conditional method

/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
// CondMeth.cs -- demonstrates the use of a conditional method
//
//                Compile this program with the following command line:
//                    C:>csc CondMeth.cs
//
#define MY_CONDITION
using System;
using System.Diagnostics;
namespace nsConditional
{
    public class CondMeth
    {
        static public void Main ()
        {
            clsTest test = new clsTest(42);
            test.ShowValue ();
        }
    }
    class clsTest
    {
        public clsTest (int num)
        {
            m_Num = num;
        }
        int m_Num;
        [Conditional("MY_CONDITION")]
        public void ShowValue()
        {
            if (m_Num < 50)
            {
                Console.WriteLine (m_Num + " is less than 50");
            }
        }
    }
}


line number

 
using System;
class Operators {
    static void Main() {
#line 300
#warning Something happened.
#warning Something else happened.
#line 400 "someotherfile.cs"
#warning Something happened later.
#line default
#warning Nothing else will happen.
    }
}


precompile marco: define, undef, elif, endif

 
#define MYOWN
#define DEBUG
#undef VERBOSE
using System;
class Operators {
    static void Main() {
#if MYOWN
        Console.WriteLine("Hi!");
#elif VERBOSE
   Console.WriteLine("Program Starting?);
#endif
        int a = 10, b = 5;
#if DEBUG
        Console.WriteLine("a={0}, b={1}", a, b);
#endif
#if MYOWN && (VERBOSE || DEBUG)
        Console.WriteLine("Continuing, Author");
#elif !MYOWN && (VERBOSE || DEBUG)
   Console.WriteLine("Continuing?);
#endif
    }
}


Preprocessor 2

/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
namespace nsPreProc
{
    using System;
    public class PreProc
    {
        static public void Main()
        {
#if ALTMAIN
#warning Compiling alternate statement
            Console.WriteLine ("Using alternate Main()");
#elif OTHERMAIN
#warning Compiling other statement
            Console.WriteLine ("Using other Main()");
#else
#warning Compiling main
            Console.WriteLine ("Using Main()");
#endif
        }
#line 200
#if SHOWERROR
        int iVar;
#error This is line 23 but the error report should show line 202
#endif
    }
}


#undef, #elif, and #else preprocessor directives

/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
  Example4_17.cs illustrates the use of the
  #undef, #elif, and #else preprocessor directives
*/
#define DEBUG
#undef DEBUG
#define PRODUCTION
public class Example4_17
{
  public static void Main()
  {
    int total = 0;
    int counter = 0;
    myLabel:
    counter++;
    total += counter;
    System.Console.WriteLine("counter = " + counter);
    if (counter < 5)
    {
#if DEBUG
      System.Console.WriteLine("goto myLabel");
#elif PRODUCTION
      System.Console.WriteLine("counter < 5");
#else
      System.Console.WriteLine("goto myLabel, counter < 5");
#endif
      goto myLabel;
    }
    System.Console.WriteLine("total = " + total);
  }
}


#undef Marco

 

#define MYOWN
#define DEBUG
#undef VERBOSE
#define PROGRAMMER_IS_BRIAN
#undef PROGRAMMER_IS_DAVE
using System;
class Preprocessor {
    static void Main() {
#if MYOWN
        Console.WriteLine("Hi Author!");
#elif VERBOSE
   Console.WriteLine("Program Starting?);
#endif
        int a = 10, b = 5;
#if DEBUG
        Console.WriteLine("a={0}, b={1}", a, b);
#endif
#if MYOWN && (VERBOSE || DEBUG)
        Console.WriteLine("Continuing, Author");
#elif !MYOWN && (VERBOSE || DEBUG)
   Console.WriteLine("Continuing?);
#endif
#if PROGRAMMER_IS_BRIAN || PROGRAMMER_IS_DAVE
#warning Execution may vary depending on programmer.
#endif
#if PROGRAMMER_IS_DAVE
#error Something you did broke this code.
#endif
    }
}


Use a symbol expression

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Use a symbol expression. 
 
#define EXPERIMENTAL 
#define TRIAL 
 
using System; 
 
public class Test2 { 
  public static void Main() { 
     
    #if EXPERIMENTAL 
      Console.WriteLine("Compiled for experimental version."); 
    #endif 
 
    #if EXPERIMENTAL && TRIAL 
       Console.Error.WriteLine("Testing experimental trial version."); 
    #endif 
   
    Console.WriteLine("This is in all versions."); 
  } 
}


Use marco to define flag variable

 

#define DEBUGGING
using System;
class Starter {
#if DEBUGGING
    static void OutputLocals() {
        Console.WriteLine("debugging...");
    }
#endif
    static void Main() {
#if DEBUGGING
        OutputLocals();
#endif
    }
}