ซอร์สโค้ดมอบอำนาจ C ++ 20 ถูกเก็บไว้ในไฟล์หรือไม่


106

คำถามแปลก ๆ เล็กน้อยคือถ้าฉันจำไม่ผิดซอร์สโค้ด C ++ ไม่ต้องการระบบไฟล์ในการจัดเก็บไฟล์

การมีคอมไพเลอร์ที่สแกนเอกสารที่เขียนด้วยลายมือผ่านกล้องจะเป็นการใช้งานที่สอดคล้องกัน แม้ว่าในทางปฏิบัติจะไม่สมเหตุสมผลมากนัก

อย่างไรก็ตาม C ++ 20 ตอนนี้เพิ่มตำแหน่งต้นทางด้วยfile_name. ตอนนี้หมายความว่าซอร์สโค้ดควรเก็บไว้ในไฟล์หรือไม่


13
นี้ได้รับใน C ตั้งแต่ตลอดไป __FILE__- คลาสsource_locationช่วยให้คุณได้รับที่ไซต์เรียกฟังก์ชัน
StaceyGirl

28
คุณไม่สามารถตั้งชื่อไฟล์ให้กับเอกสารที่เขียนด้วยลายมือของคุณได้หรือไม่?
จรด 42

8
ฉันคิดว่ามันเป็นรายละเอียดการใช้งานไม่ว่าซอร์สโค้ดจะอยู่ในไฟล์หรืออย่างอื่น หากคอมไพลเลอร์สามารถป้อนซอร์สโค้ดผ่าน stdin ซอร์สอาจอยู่ในฐานข้อมูล
Eljay

8
ตัวอย่างของฉันอาจจะไม่ค่อยดีนัก แต่ถ้าคุณใช้คอมไพเลอร์แบบ on-the-fly เช่น TCC คุณสามารถระบุชื่อแหล่งที่มาที่มนุษย์อ่านได้เพื่อประโยชน์ในการรายงานข้อผิดพลาดแม้ว่าคุณจะรวบรวมโดยตรงจากหน่วยความจำก็ตาม นั่นคือการมี "ชื่อไฟล์" ไม่ได้หมายความว่าจะถูกเก็บเป็นไฟล์ แต่อย่างใด
user7860670

2
แน่นอนว่ามันเป็นไฟล์การนำไปใช้งานเช่น<iostream> นั้นอาจไม่ใช่ไฟล์ (ถ้าคุณเห็นว่าฉันหมายถึงอะไร) ไม่ใช่ไฟล์ที่เขียนโดยนักพัฒนา?

คำตอบ:


111

ไม่ซอร์สโค้ดไม่จำเป็นต้องมาจากไฟล์ (หรือไปที่ไฟล์)

คุณสามารถคอมไพล์ (และลิงค์) 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] อ่านว่า:

  1. ข้อความของโปรแกรมจะถูกเก็บไว้ในหน่วยที่เรียกว่าซอร์สไฟล์ในเอกสารนี้ ไฟล์ต้นฉบับพร้อมกับส่วนหัวทั้งหมด (20.5.1.2) และไฟล์ต้นฉบับที่รวมอยู่ (19.2) ผ่านคำสั่งก่อนการประมวลผล #include น้อยกว่าบรรทัดต้นทางใด ๆ ที่ข้ามโดยคำสั่งก่อนการประมวลผลแบบมีเงื่อนไข (19.1) เรียกว่าหน่วยการแปล

ดังนั้นซอร์สโค้ดจึงไม่จำเป็นต้องเก็บไว้ในไฟล์ต่อ se แต่อยู่ใน "หน่วยที่เรียกว่าซอร์สไฟล์" แต่แล้วการรวมมาจากไหน? หนึ่งจะถือว่ามาจากไฟล์ที่ตั้งชื่อบนระบบไฟล์ ... แต่ก็ไม่ได้รับคำสั่งเช่นกัน

ไม่ว่าในกรณีใด ๆstd::source_locationดูเหมือนว่าจะไม่เปลี่ยนแปลงถ้อยคำนี้ใน C ++ 20 หรือมีผลต่อการตีความ (AFAICT)


9
ไปป์นั้นเป็น "ไฟล์ต้นฉบับ" สำหรับวัตถุประสงค์ของมาตรฐาน
melpomene

5
ฉันกำลังดูมาตรฐาน C ซึ่งให้คำจำกัดความ: "ข้อความของโปรแกรมจะถูกเก็บไว้ในหน่วยที่เรียกว่าไฟล์ต้นฉบับ (หรือไฟล์ก่อนการประมวลผล ) ในมาตรฐานสากลนี้" ดังนั้นไม่ว่าจะเก็บโค้ดไว้ที่ใดนั่นคือ "ซอร์สไฟล์" ใน Standardese (ภาคผนวก: ภาษาที่คล้ายกันพบในมาตรฐาน C ++ ภายใต้ [lex])
melpomene

8
@melpomene: หน่วยนี้ เรียกว่า ซอร์สไฟล์เท่านั้นไม่ได้บอกว่าจะต้องเป็นไฟล์ต้นฉบับ แต่ฉันจะแก้ไขคำตอบเพื่อรวมสิ่งนี้
einpoklum

13
เพิ่งลองใช้ GCC: "echo '#include <stdio.h> \ nint main () {printf ("% s \\ n ", __FILE__); return 1;}' | gcc -o test -xc -" ( ไม่มีเครื่องหมายคำพูด) เมื่อดำเนินการมันจะพิมพ์ <stdin> ออกมา
HBv6

11
นี่เป็นเรื่องตลกเกี่ยวกับคำศัพท์ชื่อและแนวคิดในมาตรฐาน (และวิทยาศาสตร์): โดยปกติแล้วพวกมันมักจะเป็นอะตอม นั่นคือ "ซอร์สไฟล์" ไม่จำเป็นต้องเป็น "ไฟล์" ที่เป็น "แหล่งที่มา" ในความเป็นจริงคำว่า "ไฟล์" อาจไม่สามารถกำหนดได้ - เปรียบเทียบกับตัวเลขในคณิตศาสตร์: ไม่มีสิ่งที่เรียกว่า " number ", เฉพาะ" จำนวนธรรมชาติ "," จำนวนตรรกยะ "," จำนวนจริง "ฯลฯ
Joker_vD

54

แม้กระทั่งก่อน C ++ 20 มาตรฐานมี:

__FILE__

ชื่อสันนิษฐานของซอร์สไฟล์ปัจจุบัน (ลิเทอรัลสตริงอักขระ)

คำจำกัดความเหมือนกันสำหรับsource_location::file_name.

ด้วยเหตุนี้จึงไม่มีการเปลี่ยนแปลงเกี่ยวกับการรองรับการใช้งานระบบไฟล์แบบไม่ใช้ระบบใน C ++ 20

มาตรฐานไม่ได้กำหนดว่า "ซอร์สไฟล์" หมายถึงอะไรดังนั้นการจะอ้างถึงระบบไฟล์อาจขึ้นอยู่กับการตีความ สันนิษฐานว่าอาจเป็นไปตามการนำไปใช้เพื่อสร้าง "บันทึกด้วยลายมือที่คุณมอบให้ฉันในตอนนั้น" หากนั่นระบุ "ไฟล์ต้นฉบับ" ในการใช้งานภาษานั้นจริง


โดยสรุป: ใช่แหล่งที่มาเรียกว่า "ไฟล์" ตามมาตรฐาน แต่ "ไฟล์" คืออะไรและระบบไฟล์ที่เกี่ยวข้องนั้นไม่ได้ระบุหรือไม่


2
@Yksisarvinen ฉันไม่ทราบเจตนาของคุณสมบัติ "ข้อสันนิษฐาน" ของกฎ แต่ฉันคิดว่า :) มันเป็นการชี้แจงว่าชื่อไฟล์ควรเป็นค่าสัมบูรณ์หรือบัญญัติ แต่เป็นชื่อสัมพัทธ์จากมุมมองของ คอมไพเลอร์เพียงพอ ฉันอาจจะผิด
eerorika

4
ฉันสามารถเพียงแค่เห็นscanner-c++กลับ"ซ้ายตู้สามลิ้นชักโฟลเดอร์สีแดงแบบแท็บสี่หน้า 17"
dmckee --- อดีตผู้ดูแลลูกแมว

2
FWIW ในความหมายของ POSIX ไพพ์ (หรือสิ่งที่เป็นไฟล์อื่น ๆ ) คือ "ไฟล์" - ดังนั้น stdin / stdout คือ "ไฟล์" ไม่ใช่ไฟล์ดิสก์เป็นต้นในแง่นี้

3
@Yksisarvinen: คณะกรรมการมักจะให้เบี้ยเลี้ยงสำหรับสถานการณ์ที่การดำเนินการที่คลุมเครืออาจมีเหตุผลที่ดีในการทำบางสิ่งที่ตรงกันข้ามกับพฤติกรรมที่พบบ่อย ในการทำเช่นนี้ต้องอาศัยผู้เขียนคอมไพเลอร์ในการตัดสินว่าลูกค้าของพวกเขาจะพบว่าพฤติกรรมทั่วไปมีประโยชน์มากกว่าหรือน้อยกว่าทางเลือกอื่น ความจริงที่ว่าสิ่งดังกล่าวยังคงอยู่ในวิจารณญาณของผู้ปฏิบัติงานอาจถูกมองว่าเป็น "ความคลุมเครือ" แต่เป็นความตั้งใจเนื่องจากนักเขียนเรียบเรียงที่ดีจะทราบถึงความต้องการของลูกค้ามากกว่าที่คณะกรรมการจะทำได้
supercat

1
@dmckee ... ในห้องน้ำร้างมีป้ายหน้าประตูว่า 'ระวังเสือดาว'
Andrew Henle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.