ไม่ซอร์สโค้ดไม่จำเป็นต้องมาจากไฟล์ (หรือไปที่ไฟล์)
คุณสามารถคอมไพล์ (และลิงค์) C ++ ได้อย่างสมบูรณ์ภายในไพพ์โดยวางคอมไพเลอร์ของคุณไว้ตรงกลางเช่น
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
และเป็นเช่นนั้นมาหลายทศวรรษแล้ว ดูสิ่งนี้ด้วย:
การแนะนำstd::source_location
ใน C ++ 20 ไม่ได้เปลี่ยนสถานะของสถานการณ์นี้ เป็นเพียงการที่บางรหัสจะไม่มีตำแหน่งต้นทางที่กำหนดไว้อย่างชัดเจน (หรืออาจกำหนดไว้อย่างชัดเจน แต่ไม่มีความหมายมากนัก) อันที่จริงผมจะบอกว่าการเรียกร้องในการกำหนดstd::source_location
ใช้ไฟล์เป็นสายตาสั้นเล็กน้อย ... แม้ว่าในความเป็นธรรมก็เป็นเพียงมหภาคน้อยเทียบเท่า__FILE__
และ__LINE__
ที่มีอยู่แล้วใน C ++ (และ C)
@ HBv6 ตั้งข้อสังเกตว่าหากคุณพิมพ์ค่า__FILE__
เมื่อรวบรวมโดยใช้ GCC จากสตรีมอินพุตมาตรฐาน:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
เรียกใช้งานพิมพ์ที่เรียกใช้งาน<stdin>
ได้
ซอร์สโค้ดอาจมาจากอินเทอร์เน็ต
@ Morwenn ตั้งข้อสังเกตว่ารหัสนี้:
#include <https://raw.githubusercontent.com/Morwenn/poplar-heap/master/poplar.h>
// Type your code here, or load an example.
void poplar_sort(int* data, size_t size) {
poplar::make_heap(data, data + size);
poplar::sort_heap(data, data + size);
}
ทำงานบน GodBolt (แต่จะไม่ทำงานบนเครื่องของคุณ - ไม่มีคอมไพเลอร์ยอดนิยมรองรับสิ่งนี้)
คุณเป็นทนายความด้านภาษาหรือไม่? เอาล่ะมาปรึกษาเรื่องมาตรฐาน ..
คำถามที่ว่าแหล่งโปรแกรม C ++ ต้องมาจากไฟล์นั้นไม่ได้รับคำตอบอย่างชัดเจนในมาตรฐานภาษา ดูแบบร่างของมาตรฐาน C ++ 17 (n4713) ส่วน 5.1 [lex.separate] อ่านว่า:
- ข้อความของโปรแกรมจะถูกเก็บไว้ในหน่วยที่เรียกว่าซอร์สไฟล์ในเอกสารนี้ ไฟล์ต้นฉบับพร้อมกับส่วนหัวทั้งหมด (20.5.1.2) และไฟล์ต้นฉบับที่รวมอยู่ (19.2) ผ่านคำสั่งก่อนการประมวลผล #include น้อยกว่าบรรทัดต้นทางใด ๆ ที่ข้ามโดยคำสั่งก่อนการประมวลผลแบบมีเงื่อนไข (19.1) เรียกว่าหน่วยการแปล
ดังนั้นซอร์สโค้ดจึงไม่จำเป็นต้องเก็บไว้ในไฟล์ต่อ se แต่อยู่ใน "หน่วยที่เรียกว่าซอร์สไฟล์" แต่แล้วการรวมมาจากไหน? หนึ่งจะถือว่ามาจากไฟล์ที่ตั้งชื่อบนระบบไฟล์ ... แต่ก็ไม่ได้รับคำสั่งเช่นกัน
ไม่ว่าในกรณีใด ๆstd::source_location
ดูเหมือนว่าจะไม่เปลี่ยนแปลงถ้อยคำนี้ใน C ++ 20 หรือมีผลต่อการตีความ (AFAICT)
__FILE__
- คลาสsource_location
ช่วยให้คุณได้รับที่ไซต์เรียกฟังก์ชัน