Monday, December 06, 2004

[Tech] เกี่ยวกับการ include file ใน C++

โปรเจ็ควิชา Computer Graphics สอนเราไปหลายอย่างเลยนะ เกี่ยวกับเรื่องการคอมไพล์โดยเฉพาะ header file
เราสามารถสรุปได้ดังนี้

1. ลำดับของไฟล์ที่ถูกคอมไพล์มีความสำคัญ
ที่มันมีความสำคัญขึ้นมาก็เพราะว่า เราไม่สามารถที่จะบอกได้ว่า ไฟล์ใดได้รับการ include เข้าไปแล้วบ้าง ทำให้นิยามบางอย่างยังไม่ปรากฏ ดังนั้น บางทีเราก็ต้องทำการ include ของต่างๆเข้าไปบ่อยๆในหลายๆไฟล์

2. ไม่สามารถที่จะ include ซ้ำกันในไฟล์อื่นๆได้
เพราะจะทำให้นิยามของสิ่งเดิมถูกเรียกซ้ำ ส่งผลให้มีนิยามของสิ่งเดียวกันอยู่ใน translation unit มากกว่าหนึ่งอัน (redefinition) แต่อย่างที่ได้เขียนไว้ในข้อหนึ่งลำดับการคอมไพล์มีความสำคัญ ทำให้เรามีความต้องการที่จะ include บ่อยๆไปทุกที่ แต่ในขณะเดียวกัน เราก็รู้ว่า เรายอมให้ซ้ำไม่ได้

3. วิธีแก้ปัญหาของ 1 และ 2 ในคราวเดียวกัน
สามารถทำได้โดยยึดตามแนวทาง 1 เป็นหลัก กล่าวคือ include ซ้ำไปเถอะ แล้วให้เราไปแก้ที่ header file ให้ป้องกันการนำนิยามของตัวเองไปใส่ที่ translation unit ซ้ำ ซึ่งสามารถทำได้โดย
3.1. ในกรณีที่คุณใช้ MS Visual C++ version ใหม่ๆ สามารถทำได้ง่ายด้วยไดเรกทิฟ #pragma once
3.2. สำหรับคอมไพลเลอร์อื่นๆควรใช้วิธีมาตรฐานคือ ในตอนต้นของ header file ให้ใส่ไดเรกทิฟเกี่ยวกับการนิยามเข้าไปว่า
#ifndef INC_FILENAME_H //ไอ้ INC_FILENAME_H นี่จริงๆแล้วจะเป็นอะไรก็ได้ ขอแค่อย่าให้ไปซ้ำกับชาวบ้านก็พอ
#define INC_FILENAME_H

จากนั้น ก็ใส่เนื้อหาของ header file เข้าไปแล้วจบลงด้วย
#endif

No comments: