ข้อดีของการประกาศในไฟล์. inl คืออะไร? ฉันจะต้องใช้สิ่งเดียวกันนี้เมื่อใด
ข้อดีของการประกาศในไฟล์. inl คืออะไร? ฉันจะต้องใช้สิ่งเดียวกันนี้เมื่อใด
คำตอบ:
.inl
ไฟล์ไม่เคยบังคับและไม่มีความสำคัญเป็นพิเศษสำหรับคอมไพเลอร์ เป็นเพียงวิธีการจัดโครงสร้างโค้ดของคุณที่ให้คำแนะนำแก่มนุษย์ที่อาจอ่านมัน
ฉันใช้.inl
ไฟล์ในสองกรณี:
ในทั้งสองกรณีฉันใส่การประกาศฟังก์ชั่นในไฟล์ส่วนหัวซึ่งรวมอยู่ในไฟล์อื่นจากนั้นฉัน #include
.inl
ไฟล์ที่ด้านล่างของไฟล์ส่วนหัว
ฉันชอบมันเพราะมันแยกอินเทอร์เฟซออกจากการใช้งานและทำให้ไฟล์ส่วนหัวอ่านง่ายขึ้นเล็กน้อย หากคุณสนใจเกี่ยวกับรายละเอียดการใช้งานคุณสามารถเปิด.inl
ไฟล์และอ่านได้ ถ้าไม่ทำก็ไม่ต้อง
.tcc
สำหรับไฟล์การใช้งานเทมเพลต
glm
ใช้. hpp และ. inl ในลักษณะเดียวกับที่คุณได้กล่าวไว้ข้างต้น ขอขอบคุณสำหรับคำตอบที่ดี :)
นิคเมเยอร์ถูกต้อง: คอมไพเลอร์ไม่สนใจส่วนขยายของไฟล์ที่คุณรวมอยู่ดังนั้นสิ่งต่างๆเช่น ".h", ".hpp", ".hxx", ".hh", ".inl", ".inc" ฯลฯ เป็นหลักการง่ายๆเพื่อให้ชัดเจนว่าไฟล์ควรมีอะไรบ้าง
ตัวอย่างที่ดีที่สุดคือไฟล์ส่วนหัว STL ซึ่งไม่มีนามสกุลใด ๆ
โดยปกติไฟล์ ".inl" จะมีโค้ดแบบอินไลน์ (ดังนั้นนามสกุล ".inl")
ไฟล์ ".inl" เหล่านั้นเป็นสิ่งจำเป็นเมื่อคุณมีวงจรการพึ่งพาระหว่างโค้ดส่วนหัว
ตัวอย่างเช่น:
// A.hpp
struct A
{
void doSomethingElse()
{
// Etc.
}
void doSomething(B & b)
{
b.doSomethingElse() ;
}
} ;
และ:
// B.hpp
struct B
{
void doSomethingElse()
{
// Etc.
}
void doSomething(A & a)
{
a.doSomethingElse() ;
}
} ;
ไม่มีทางที่คุณจะรวบรวมได้รวมถึงการใช้การประกาศล่วงหน้า
จากนั้นวิธีแก้ปัญหาคือการแบ่งคำจำกัดความและการใช้งานออกเป็นไฟล์ส่วนหัวสองประเภท:
hpp
สำหรับการประกาศ / คำจำกัดความส่วนหัวinl
สำหรับการใช้งานส่วนหัวซึ่งแบ่งออกเป็นตัวอย่างต่อไปนี้:
// A.hpp
struct B ;
struct A
{
void doSomethingElse() ;
void doSomething(B & b) ;
} ;
และ:
// A.inl
#include <A.hpp>
#include <B.hpp>
inline void A::doSomethingElse()
{
// Etc.
}
inline void A::doSomething(B & b)
{
b.doSomethingElse() ;
}
และ:
// B.hpp
struct A ;
struct B
{
void doSomethingElse() ;
void doSomething(A & a) ;
} ;
และ:
// B.INL
#include <B.hpp>
#include <A.hpp>
inline void B::doSomethingElse()
{
// Etc.
}
inline void B::doSomething(A & a)
{
a.doSomethingElse() ;
}
ด้วยวิธีนี้คุณสามารถรวมไฟล์ ".inl" อะไรก็ได้ที่คุณต้องการในแหล่งที่มาของคุณเองและมันจะใช้งานได้
อีกครั้งชื่อต่อท้ายของไฟล์ที่รวมไม่ได้มีความสำคัญ แต่เพียงการใช้งานเท่านั้น
If the function were not inline, you would you standard .cpp file for the implementation part?
:: เป็นไปได้. เทมเพลตคือตัวอย่างของรหัสที่โดยปกติไม่สามารถซ่อนไว้ในไฟล์. CPP ดังนั้นในกรณีนี้ไฟล์. INL จึงเป็นสิ่งจำเป็น
เนื่องจากไม่มีใครพูดถึง:
การใช้ไฟล์. inl เพื่อจัดเก็บฟังก์ชันแบบอินไลน์จะมีประโยชน์ในการเร่งความเร็วการคอมไพล์
หากคุณรวมเฉพาะการประกาศ (.h) ที่คุณต้องการการประกาศและรวมเฉพาะการใช้งานแบบอินไลน์ (.inl) ที่คุณต้องการ (เช่นอาจเป็นเฉพาะใน. cpp และไฟล์. in อื่น ๆ ไม่ใช่. h) ก็สามารถมีได้ ผลประโยชน์ต่อการพึ่งพาส่วนหัวของคุณ
นี่อาจเป็นชัยชนะครั้งสำคัญในโครงการขนาดใหญ่ที่มีคลาสโต้ตอบมากมาย
จากประสบการณ์ของฉันไฟล์. inl ถูกใช้เพื่อกำหนดฟังก์ชันแบบอินไลน์ เมื่ออยู่ในไฟล์. inl ไฟล์สามารถรวมอยู่ในส่วนหัวเพื่อรับฟังก์ชันแบบอินไลน์และในไฟล์. c เพื่อรับข้อกำหนดฟังก์ชันปกติ
ด้วยวิธีนี้แหล่งที่มาเดียวกันสามารถทำงานร่วมกับคอมไพเลอร์ที่ไม่มีการสนับสนุนฟังก์ชันอินไลน์ได้ง่ายขึ้นเช่นเดียวกับคอมไพเลอร์ที่ทำ
โดยปกติจะใช้กับรหัส C ตรงไม่ใช่รหัส C ++ บ่อยนักเนื่องจากคอมไพเลอร์ C ++ ทั้งหมดรองรับฟังก์ชันแบบอินไลน์
#define inline static
และกำหนดฟังก์ชันอินไลน์ของคุณในส่วนหัว
ฉันเชื่อว่ามันเป็นเพียงหลักการตั้งชื่อสำหรับไฟล์ "ส่วนหัว" ที่มีโค้ดอินไลน์ ดังนั้นไฟล์. h จึงมีคำจำกัดความและไฟล์. inl มีโค้ดอินไลน์ซึ่งจำเป็นสำหรับเทมเพลต
ฉันไม่เชื่อว่าจะมีอะไรมากกว่าการตั้งชื่อเพื่อให้จุดประสงค์ของไฟล์ชัดเจน