0Pricing
C Academy · บทเรียน

ค่าคงที่ #define

ใช้ค่าคงที่ของตัวประมวลผลก่อนคอมไพล์

ค่าคงที่ #define เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

#define ทำอะไร

#define เป็นคำสั่งของตัวประมวลผลก่อนที่สร้างมาโคร กล่าวคือเป็นชื่อที่ตัวประมวลผลก่อนจะแทนที่ด้วยข้อความก่อนการคอมไพล์

โดยทั่วไปมักใช้ตั้งชื่อที่อ่านเข้าใจง่ายให้กับค่าคงที่ เช่น ขนาดบัฟเฟอร์หรือขีดจำกัด

#define MAX_LEN 256

การแทนที่ด้วยข้อความ

มาโครเป็นการแทนที่ด้วยข้อความล้วน ทุกตำแหน่งที่ปรากฏ MAX_LEN ตัวประมวลผลก่อนจะแทนที่ด้วย 256

ไม่มีชนิดข้อมูลและไม่มีหน่วยความจำ การแทนที่นี้เกิดขึ้นก่อนที่คอมไพเลอร์จะเห็นโค้ดเสียอีก

#include <stdio.h>
#define MAX_LEN 256
int main(void) {
    printf("%d\n", MAX_LEN);
    return 0;
}

ไม่มีอัฒภาค

ข้อผิดพลาดที่พบบ่อยคือการใส่อัฒภาคต่อท้าย #define

อัฒภาคจะกลายเป็นส่วนหนึ่งของข้อความที่ใช้แทนที่ และอาจทำให้เกิดข้อผิดพลาดที่สับสนได้ อย่าใส่อัฒภาคต่อท้าย

#define PI 3.14159     /* correct */
#define BAD 10;        /* wrong: semicolon is substituted too */

การกำหนดค่าคงที่แบบทศนิยม

มาโครใช้ได้กับค่าตามตัวอักษรทุกชนิด รวมถึงค่าชนิดเลขทศนิยม

ในที่นี้ PI จะถูกแทนที่ลงในสูตรหาพื้นที่ทุกครั้งที่มีการใช้งาน

#include <stdio.h>
#define PI 3.14159
int main(void) {
    double r = 2.0;
    printf("%.2f\n", PI * r * r);
    return 0;
}

การใช้มาโครกำหนดขนาดอาร์เรย์

มักใช้มาโครกำหนดขนาดอาร์เรย์ เนื่องจากต้องทราบค่านี้ตั้งแต่เวลาคอมไพล์

การใช้ชื่อช่วยให้เก็บขนาดไว้ในจุดเดียวและแก้ไขได้ง่าย

#include <stdio.h>
#define SIZE 5
int main(void) {
    int data[SIZE] = {1, 2, 3, 4, 5};
    printf("%d\n", data[SIZE - 1]);
    return 0;
}

ใส่วงเล็บให้นิพจน์เสมอ

หากมาโครขยายเป็นนิพจน์ ควรครอบนิพจน์นั้นด้วยวงเล็บ

หากไม่มีวงเล็บ ลำดับความสำคัญของตัวดำเนินการอาจเปลี่ยนความหมายเมื่อใช้มาโครภายในนิพจน์ที่ใหญ่ขึ้น

#define WIDTH (4 + 2)   /* good */
#define BADW 4 + 2       /* risky: 10 * BADW becomes 10*4+2 */

เหตุผลที่วงเล็บมีความสำคัญ

โปรแกรมนี้แสดงให้เห็นความแตกต่าง เมื่อมีวงเล็บ WIDTH จะถูกคูณทั้งก้อน หากไม่มีวงเล็บ จะมีเพียงบางส่วนที่ถูกคูณ

เวอร์ชันที่ปลอดภัยจะแสดงผลเป็น 60 ส่วนการขยายที่ไม่ปลอดภัยจะคำนวณได้แตกต่างออกไป

#include <stdio.h>
#define WIDTH (4 + 2)
int main(void) {
    printf("%d\n", 10 * WIDTH);
    return 0;
}

มาโครสตริง

มาโครยังใช้แทนค่าสตริงตามตัวอักษรได้ ซึ่งมีประโยชน์สำหรับข้อความคงที่หรือชื่อรุ่น

ข้อความจะถูกแทนที่ตรงตามเดิม รวมถึงเครื่องหมายอัญประกาศ

#include <stdio.h>
#define APP_NAME "CoddyKit"
int main(void) {
    printf("Welcome to %s\n", APP_NAME);
    return 0;
}

#define เทียบกับ const

มาโครไม่มีชนิดข้อมูลและไม่มีที่อยู่ ส่วนตัวแปร const มีทั้งสองอย่างและปฏิบัติตามขอบเขต

ควรเลือกใช้ const เมื่อคุณต้องการความปลอดภัยด้านชนิดข้อมูลและการมองเห็นระหว่างการตรวจแก้จุดบกพร่อง ส่วน #define ให้ใช้กับค่าคงที่ที่ต้องทราบขณะคอมไพล์ เช่น ขนาดอาร์เรย์

#define M_SIZE 10
const int c_size = 10;

การยกเลิกนิยามและตัวป้องกัน

คุณสามารถลบมาโครได้ด้วย #undef มาโครยังเป็นกลไกที่ใช้สร้างตัวป้องกันไฟล์ส่วนหัว ซึ่งป้องกันการรวมไฟล์ซ้ำ

ตัวอย่างนี้แสดงรูปแบบตัวป้องกันแบบดั้งเดิมที่ใช้บริเวณต้นไฟล์ส่วนหัว

#ifndef CONFIG_H
#define CONFIG_H
/* header contents here */
#endif

หลักการตั้งชื่อแบบเดิม

ตามธรรมเนียมที่ใช้กันมายาวนาน ชื่อมาโครจะเขียนด้วยรูปแบบ UPPER_CASE

รูปแบบนี้ช่วยให้สังเกตได้ด้วยตาว่าเป็นค่าคงที่ของตัวประมวลผลก่อน และช่วยหลีกเลี่ยงการชนกับชื่อตัวแปรทั่วไป

#include <stdio.h>
#define BUFFER_SIZE 1024
int main(void) {
    printf("%d\n", BUFFER_SIZE);
    return 0;
}

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับมาโคร

สรุปทบทวน

#define สร้างมาโครที่ตัวประมวลผลก่อนแทนที่ด้วยข้อความ โดยไม่มีชนิดข้อมูล ไม่มีอัฒภาค และไม่มีหน่วยความจำ

ใส่วงเล็บให้นิพจน์ และเลือกใช้ const สำหรับค่าที่ปลอดภัยด้านชนิดข้อมูล ส่วนมาโครควรสงวนไว้สำหรับความต้องการขณะคอมไพล์ เช่น ขนาดอาร์เรย์และตัวป้องกันไฟล์ส่วนหัว

คำถามที่พบบ่อย

บทเรียน “ค่าคงที่ #define” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ค่าคงที่ #define” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ค่าคงที่ #define”

ใช้ค่าคงที่ของตัวประมวลผลก่อนคอมไพล์ คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ค่าคงที่ #define” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. กำหนด enum
  2. ค่า enum และช่วง
  3. ตัวแปร const
  4. ค่าคงที่ #define
← กลับไปที่ C Academy