3
"อินไลน์" ที่ไม่มี "คงที่" หรือ "ภายนอก" จะมีประโยชน์ใน C99 หรือไม่?
เมื่อฉันพยายามสร้างรหัสนี้ inline void f() {} int main() { f(); } โดยใช้บรรทัดคำสั่ง gcc -std=c99 -o a a.c ฉันได้รับข้อผิดพลาดตัวเชื่อมโยง (ไม่ได้กำหนดอ้างอิงถึงf) ข้อผิดพลาดจะหายไปหากฉันใช้static inlineหรือextern inlineแทนที่จะเป็นเพียงแค่inlineหรือถ้าฉันคอมไพล์ด้วย-O(ดังนั้นฟังก์ชันจะถูกแทรกในบรรทัด) พฤติกรรมนี้ดูเหมือนจะกำหนดไว้ในย่อหน้า 6.7.4 (6) ของมาตรฐาน C99: หากการประกาศขอบเขตไฟล์ทั้งหมดสำหรับฟังก์ชันในหน่วยการแปลมีตัวinlineระบุฟังก์ชันที่ไม่มีexternคำจำกัดความในหน่วยการแปลนั้นจะเป็นนิยามแบบอินไลน์ คำจำกัดความแบบอินไลน์ไม่ได้ให้คำจำกัดความภายนอกสำหรับฟังก์ชันและไม่ห้ามการกำหนดภายนอกในหน่วยการแปลอื่น นิยามแบบอินไลน์เป็นทางเลือกให้กับนิยามภายนอกซึ่งนักแปลอาจใช้เพื่อเรียกใช้ฟังก์ชันใด ๆ ในหน่วยการแปลเดียวกัน ไม่ได้ระบุว่าการเรียกใช้ฟังก์ชันใช้นิยามอินไลน์หรือนิยามภายนอก ถ้าฉันเข้าใจทั้งหมดนี้อย่างถูกต้องหน่วยคอมไพล์ที่มีฟังก์ชันที่กำหนดไว้inlineในตัวอย่างด้านบนจะคอมไพล์อย่างสม่ำเสมอก็ต่อเมื่อมีฟังก์ชันภายนอกที่มีชื่อเดียวกันและฉันไม่เคยรู้ว่าฟังก์ชันของตัวเองหรือฟังก์ชันภายนอกถูกเรียกใช้ พฤติกรรมนี้ไม่โง่อย่างสมบูรณ์หรือไม่? การกำหนดฟังก์ชันinlineโดยไม่มีstaticหรือexternใน C99 มีประโยชน์หรือไม่? ฉันพลาดอะไรไปรึเปล่า? สรุปคำตอบ แน่นอนว่าฉันพลาดอะไรบางอย่างไปและพฤติกรรมก็ไม่ได้บ้าคลั่ง :) ตามที่Nemo อธิบายแนวคิดคือการกำหนดนิยามของฟังก์ชัน inline void f() {} ในไฟล์ส่วนหัวและมีเพียงการประกาศเท่านั้น extern inline …