ค่าคงที่ #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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- กำหนด enum
- ค่า enum และช่วง
- ตัวแปร const
- ค่าคงที่ #define