Preprocessor directives

5 September 2016

Preprocessor directives เป็นคำสั่งของโปรแกรมที่ประมวลผลในตอนที่คอมไพเลอร์เริ่มต้นทำงาน ซึ่งมันทำงานโดย preprocessor และก่อนที่โปรแกรมจะสร้าง executable file ที่ใช้ในการรันโปรแกรม preprocessor directives นั้นเริ่มต้นด้วยเครื่องหมาย hash (#) และมันใช้บรรทัดใหม่ในการสิ้นสุดคำสั่ง

นี่เป็นตารางของ Preprocessor directives ที่มีในภาษา C#

DirectivesDescriptions
#ifตรวจสอบถ้าหาก symbol ได้ถูกกำหนด
#elseคำสั่งถ้าหากเงื่อนไขจาก #if ไม่ได้ถูกกำหนด
#elifตรวจสอบถ้าหากมีการกำหนด symbol แบบหลายตัวเลือก
#endifใช้ควบคู่กับ #if เพื่อปิดบล็อคคำสั่ง
#defineใช้เพื่อกำหนด symbol ในโปรแกรม
#undefใช้เพื่อยกเลิก symbol ในโปรแกรม
#warningใช้เพื่อให้คอมไพเลอร์สร้างการแจ้งเตือน
#errorใช้เพื่อให้คอมไพเลอร์สร้างข้อผิดพลาด
#lineแก้ไขหมายเลขบรรทัดของคอมไพเลอร์
#regionใช้ในการกำหนดขอบเขตหรือส่วนของโค้ด
#endregionใช้ควบคู่กับ #region เพื่อสิ้นสุดบล็อคคำสั่ง
#pragmaใช้คำสั่งสร้างคำสั่ง preprocessing แบบกำหนดเอง

ในภาษา C# สนับสนุน proprocessor directives รูปแบบต่างๆ เพื่อใช้ในวัตถุประสงค์ที่แตกต่างกันออกไป ต่อไปมาดูตัวอย่างในการใช้งาน

Macro definitions (#define, #undef)

Macro definitions เป็น directive ที่ใช้กำหนดหรือยกเลิก symbol ที่ใช้ในขอบเขตของโปรแกรม โดยมันมีรูปแบบการประกาศดังนี้

#define SYMBOL_NAME
#undef SYMBOL_NAME

ในการประกาศ symbol ใช้ directive #define ตามด้วยชื่อของ symbol ที่ต้องการประกาศ และการยกเลิกใช้ directive #undef ตามด้วยชื่อของ symbol ที่ต้องการยกเลิก

#define DEBUG

using System;
...

ในตัวอย่าง เราได้ประกาศ symbol DEBUG ในการใช้ directive #define และ #undef นั้น คุณจะต้องทำก่อนคำสั่งปกติของโปรแกรมทั้งหมด

Conditional inclusions (#if, #elif , #else and #endif)

Conditional inclusions เป็น directives เพื่อใช้สำหรับตรวจสอบว่า symbol ว่าได้ถูกกำหนดโดย directive #define หรือไม่ ถ้าคำสั่งถูกกำหนด คอมไพเลอร์จะทำงานในบล็อคของ directive #if ที่สิ้นสุดด้วย directive #endif

#if เป็น directive ที่ใช้สำหรับตรวจสอบถ้าหากว่า symbol ได้ถูกกำหนด คอมไพลเลอร์จะประมวลผลในบล็อคของคำสั่งที่จบด้วย directive #endif สำหรับ directive#elif และ #else เป็นทางเลือกในกรณีที่การเปรียบเทียบแบบหลายตัวเลือก มาดูตัวอย่างในการใช้งาน

#define DEBUG

using System;

class PreprocessorDirectives
{
    static void Main(string[] args)
    {
#if DEBUG
        Console.WriteLine("Program run in debug mode.");
#endif
    }
}

ในตัวอย่างด้านบน เราได้ประกาศ symbol DEBUG และใช้ directive #if ในการตรวจสอบ ใน expression #if DEBUG โดยถ้าหาก DEBUG ถูกประกาศ คอมไพลเลอร์จะประมวลผลในบล็อคของ directive #if

ต่อไปมาดูตัวอย่างเพิ่มเติมในการใช้คำสั่งที่เหลือ

#define DEBUG
#define VERSION_2

using System;

class PreprocessorDirectives
{
    static void Main(string[] args)
    {
#if VERSION_1 && DEBUG
        Console.WriteLine("Version 1 and debug mode is enabled.");
#elif VERSION_2 && DEBUG
        Console.WriteLine("Version 2 and debug mode is enabled.");
#else
        Console.WriteLine("Unknown version.");
#endif
    }
}

ในตัวอย่าง เราได้ประกาศสอง symbol คือ DEBUG และ VERSION_2 เราสามารถใช้ตัวดำเนินการตรรกศาสตร์ ! && และ || ในการสร้าง expression ย่อยได้ และเราได้ใช้ directive #elif และ #else ในการตรวจสอบสำหรับการมีหลายตัวเลือกเพื่อให้คอมไพเลอร์ตรวจสอบ

#warning and #error directives

ในภาษา C# ให้เราสามารถสั่งให้คอมไพลเลอร์สร้างการแจ้งเตือนได้โดยใช้ directive #warning และสร้างข้อผิดพลาดโดยใช้ directive #error ซึ่งมีประโยชน์ในการเตือนโปรแกรมเมอร์ในการเขียนโปรแกรม เพื่อบอกหรือเตือนบางอย่าง

ข้างล่างเป็นตัวอย่างในการใช้ #wringing และ #error ในภาษา C#

using System;

class PreprocessorDirectives
{
    static void Main(string[] args)
    {
        Divide(3, 2);
        DeprecatedMethod();
    }

    static float Divide (int a, int b)
    {
        #warning Divide two integers may cause of precision loss.
        return a / b;
    }
    static void DeprecatedMethod ()
    {
        #error This method is deprecated.
    }
}

ในตัวอย่าง เราได้ใช้ directive #warning ในการแจ้งเตือนถ้าหากมีการใช้เมธอด Divide() ซึ่งเป็นเมธอดในการหารตัวเลข integer สองจำนวนซึ่งอาจจะทำให้เกิดข้อมูลสูญหาย และ directive #error ในการแจ้งเตือนถ้าหากมีการใช้เมธอดที่ยกเลิกการใช้งานแล้ว สำหรับการแจ้งเตือนที่เกิดโดย #error โปรแกรมจะไม่สามารถรันได้

Error List Windows in Visual Studio

นี่เป็นรูปผลลัพธ์ของ Error List Windows ใน Visual Studio เมื่อเราคอมไพล์โปรแกรม จะเกิดข้อความแจ้งเตือนและผิดพลาดเกิดขึ้น เพราะเราเรียกใช้เมธอดดังกล่าว ในการที่จะคอมไพล์โปรแกรมได้ ต้องนำโค้ดคำสั่งบรรทัดที่เรียกใช้เมธอด DeprecatedMethod() ในเมธอด Main() ออกไป

#region and #endregion directives

ในภาษา C# ยังมี directive ที่ใช้สำหรับกำหนดกลุ่มของคำสั่งไว้ด้วยกัน คือ directive #region และสิ้นสุดด้วย directive #endregion มันมักจะถูกใช้สำหรับคอมเมนต์และแบ่งแยกส่วนต่างๆ ของโค้ดเพื่อให้ง่ายต่อการดูและตรวจสอบ มาดูตัวอย่างการใช้งาน

class RegionExample
{
    #region variables declareations
    int a;
    float b;
    #endregion

    #region methods declaration
    static void Method1 (string s)
    {
    }
    static void Method2()
    {
    }
    #endregion
}

ในตัวอย่าง เราได้สร้างสอง #region ในคลาส RegionExample เพื่อใช้สำหรับแบ่งกลุ่มการประกาศสมาชิกของคลาสที่เป็นตัวแปรและเมธอด โดยในแต่ละบล็อกของ #region จะจบด้วย directive #endregion

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ preprocessor directives ประเภทต่างๆ ในภาษา C# และประโยชน์ในการนำไปใช้งานกับการเขียนโปรแกรม และคุณทราบว่า directive เหล่านี้ประมวลผลโดย preprocessor ในตอนคอมไพล์โปรแกรม

บทความนี้เป็นประโยชน์หรือไม่?Yes·No