Theppitak's blog

My personal blog.

09 พฤษภาคม 2547

C99

พอดีดูดบทความเรื่อง C99 จาก IBM developerWorks ลงปาล์มไว้ เพิ่งได้เอามาอ่าน ก็รีวิวสิ่งที่ ISO C ได้กำหนดเพิ่มเติมจาก ANSI C ที่เคยใช้กันพอควร โดยดึงเอาฟีเจอร์หลายๆ อย่างมาจาก C++ แต่หลายอย่างที่เพิ่มเข้ามาอีก ก็ทำให้ C99 นี้ ไม่ compat กับ C++ อีกต่อไป

สิ่งที่เพิ่มขึ้นมา เช่น

  • C++ comment โดยใช้ //
  • การประกาศตัวแปรปนกับโค้ดได้แบบ C++
  • for loop ที่ประกาศตัวแปรได้:
        for (int i = 0; i < 10; i++)
          ...
    
  • variable length array สำหรับตัวแปรแบบ auto สามารถใช้ตัวแปรกำหนดขนาด array ได้
  • structure with flexible array: ประกาศ struct ที่มี array ไม่ระบุขนาดได้ ใช้กับการ allocate struct แบบ dynamic (โดย array ต้องเป็น member สุดท้ายเท่านั้น)
        struct flex {
          size_t len;
          unsigned char data[];
        };
    
        struct flex *p = malloc (sizeof (flex) + 100);
        flex.len = 100;
        unsigned char c = flex.data[99]; // OK
    
  • designated initializer
        struct xyz { int a; int b; int c[99]; };
    
        struct xyz x = { .b = 99, .a = -99 };  // c[] are zero-filled
        struct xyz y = { .b = 99 };  // a, c[] are zero-filled
        struct xyz z[20] = { [3].a = 99, [3].c[2] = 88; };
    
  • compound literal แนวคิดคล้าย intermediate object ของ C++
        int *p = (int []) { 1, 2 };  // p points to unnamed array of int[2]
        int *q = (int []) { 1, foo() };  // OK
        select (0, 0, 0, 0, & (struct timeval) { .tv_usec = n });
    
  • ชนิด _Bool เป็น boolean type มีค่า 1 (จริง) และ 0 (เท็จ) และมี <stdbool.h> heeader ที่กำหนดชนิด bool มีค่าเป็น true และ false เหมือน C++ ด้วย
  • ตัวแปรชนิด long long และตัวแปร integer แบบกำหนดขนาดตายตัว (int32_t, int_least8_t)
  • inline function!
  • __func__ macro แทนชื่อฟังก์ชันปัจจุบัน ช่วยในการ debug นอกเหนือจาก __FILE__ และ __LINE__
  • ฯลฯ

ปัจจุบันมีคอมไพเลอร์หลายตัวสนับสนุน C99 กันแล้ว (ความจริงแล้ว หลายอย่างใน C99 ก็มาจาก extension ของคอมไพเลอร์ทั้งหลายนั่นแหละ) รวมทั้ง gcc ด้วย แต่ดูเหมือนยังไม่ครบ จึงขึ้นอยู่กับวิจารณญาณของนักพัฒนา ว่าจะเลือกใช้ฟีเจอร์ใหม่เพื่อความชัดเจนของโค้ด แลกกับ portability ที่เสียไปหรือไม่

ลิงก์ที่น่าสนใจ

0 ความเห็น:

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem