สงสัยเรื่อง #define และ typedef ในภาษา C

  • 7 Replies
  • 2921 Views
*

Offline zero

  • **
  • 72
    • View Profile
ศึกษาและเขียนภาษา C แล้วมีบางเรื่องไม่เข้าใจครับ ขอสอบถามผู้รู้ด้วยครับ
ในภาษา C เราใช้ #define เพื่อแทนคำสั่งบ้าง แทนข้อมูลบ้าง ก็สะดวกดี และลัดการเขียนยาวๆ (แต่เห็นว่าไม่ได้ลดขนาด)
แต่สงสัยแล้ว typedef มีไว้เพื่อประโยชน์อย่างไรครับ ? เพราะจริงๆแล้ว เราสามารถใช้ #define ก็สามารถใช้แทน typedef ไม่ใช่หรือ ?
(เห็น typedef ก็ลดการเขียนยาวๆได้เหมือนกัน คล้ายๆ #define)
เช่นมีการระบุ
typedef unsigned char uchar_t;
แต่ก็สามารถใช้
#define uchar_t unsigned char
นอกจากนี้ #define ก็ค่อนข้างเก่งเอามากๆเลยครับ ส่งค่าได้ด้วย เลยไม่รู้จะใช้ typedef ไปเพื่ออะไรกันครับ

*

Offline firmware.c

  • *****
  • 181
  • Firmware Design
    • View Profile
ถ้าเป็นลักษณะนี่ผมแนะนำให่้ใช้ typedef ดีกว่า ไม่แนะนำใช้ #define
มีตัวอย่างให้ จขกท พิจารณาตามด้านล่างครับ

Code: [Select]
1)
#define  puchar_t unsigned char *
puchar_t test1, test2;

2)
typedef  unsigned char *  puchar_t;
puchar_t test1, test2;

ลองดูว่าต่างกันอย่างไร
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

*

Offline zero

  • **
  • 72
    • View Profile
ถ้าเป็นลักษณะนี่ผมแนะนำให่้ใช้ typedef ดีกว่า ไม่แนะนำใช้ #define
มีตัวอย่างให้ จขกท พิจารณาตามด้านล่างครับ

Code: [Select]
1)
#define  puchar_t unsigned char *
puchar_t test1, test2;

2)
typedef  unsigned char *  puchar_t;
puchar_t test1, test2;

ลองดูว่าต่างกันอย่างไร

ขอบคุณท่าน firmware.c มากครับ ที่ช่วยแนะนำ
เข้าใจแล้วครับว่าต่างกัน โดย 1) จะได้ test2 เป็นแบบ unsigned char ไม่ใช่ pointer of unsigned char ต่างจากแบบ 2) ที่จะได้เป็น pointer of unsigned char ทั้ง test1 และ test2
แสดงว่า typedef เหมาะกับการใช้กับการกำหนดพวกกลุ่ม pointer ใช่ไหมครับ ? นอกเหนือเรื่องนี้ ก็เสียเปรียบ #define อยู่ดี หรือว่ายังเข้าใจผิดอยู่

*

Offline firmware.c

  • *****
  • 181
  • Firmware Design
    • View Profile
ถ้าเป็นลักษณะนี่ผมแนะนำให่้ใช้ typedef ดีกว่า ไม่แนะนำใช้ #define
มีตัวอย่างให้ จขกท พิจารณาตามด้านล่างครับ

Code: [Select]
1)
#define  puchar_t unsigned char *
puchar_t test1, test2;

2)
typedef  unsigned char *  puchar_t;
puchar_t test1, test2;

ลองดูว่าต่างกันอย่างไร

ขอบคุณท่าน firmware.c มากครับ ที่ช่วยแนะนำ
เข้าใจแล้วครับว่าต่างกัน โดย 1) จะได้ test2 เป็นแบบ unsigned char ไม่ใช่ pointer of unsigned char ต่างจากแบบ 2) ที่จะได้เป็น pointer of unsigned char ทั้ง test1 และ test2
แสดงว่า typedef เหมาะกับการใช้กับการกำหนดพวกกลุ่ม pointer ใช่ไหมครับ ? นอกเหนือเรื่องนี้ ก็เสียเปรียบ #define อยู่ดี หรือว่ายังเข้าใจผิดอยู่

#define มันเป็น preprocessor ครับ มันคนละแบบกัน อาจใช้งานแทน typedef ได้อย่างที่คุณกล่าวมา คุณต้องแยกให้ออกว่า preprocessor คืออะไรประเด็นสำคัญมันอยู่ตรงนี้ครับ
 ;)
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

*

Offline zero

  • **
  • 72
    • View Profile
Quote
#define มันเป็น preprocessor ครับ มันคนละแบบกัน อาจใช้งานแทน typedef ได้อย่างที่คุณกล่าวมา คุณต้องแยกให้ออกว่า preprocessor คืออะไรประเด็นสำคัญมันอยู่ตรงนี้ครับ
 ;)

ขอบคุณท่าน firmware.c ในคำแนะนำเพิ่มเติมครับ
แสดงว่า typedef ไม่ใช่ preprocessor ใช่ไหมครับ ? แสดงว่า หลงเข้าใจผิดไป คิดว่าเป็นแบบเดียวกัน เพราะเห็นต้องกำหนดก่อนใช้งาน

*

Offline firmware.c

  • *****
  • 181
  • Firmware Design
    • View Profile
Quote
#define มันเป็น preprocessor ครับ มันคนละแบบกัน อาจใช้งานแทน typedef ได้อย่างที่คุณกล่าวมา คุณต้องแยกให้ออกว่า preprocessor คืออะไรประเด็นสำคัญมันอยู่ตรงนี้ครับ
 ;)

ขอบคุณท่าน firmware.c ในคำแนะนำเพิ่มเติมครับ
แสดงว่า typedef ไม่ใช่ preprocessor ใช่ไหมครับ ? แสดงว่า หลงเข้าใจผิดไป คิดว่าเป็นแบบเดียวกัน เพราะเห็นต้องกำหนดก่อนใช้งาน
ไม่ใช่ preprocessor ครับ
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+


*

Offline zero

  • **
  • 72
    • View Profile
ขอบคุณทุกๆคำแนะนำครับ เข้าใจขึ้นมากแล้วครับ  :)