Không, mã nguồn không nhất thiết phải đến từ một tệp (cũng không phải đến một tệp).
Bạn có thể biên dịch (và liên kết) C ++ hoàn toàn trong một đường ống, đặt trình biên dịch của bạn ở giữa, ví dụ:
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
và nó đã như vậy trong nhiều thập kỷ. Xem thêm:
Sự ra đời của std::source_location
C ++ 20 không thay đổi trạng thái này. Chỉ là một số mã sẽ không có vị trí nguồn được xác định rõ ràng (hoặc nó có thể được xác định rõ ràng, nhưng không có ý nghĩa lắm). Trên thực tế, tôi muốn nói rằng sự khăng khăng về việc xác định std::source_location
bằng cách sử dụng các tệp là hơi hoang đường ... mặc dù công bằng mà nói, nó chỉ là một tương đương ít macro __FILE__
và __LINE__
đã tồn tại trong C ++ (và C).
@ HBv6 lưu ý rằng nếu bạn in giá trị của __FILE__
khi biên dịch bằng GCC từ luồng đầu vào chuẩn:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
chạy các bản in thực thi kết quả <stdin>
.
Mã nguồn thậm chí có thể đến từ Internet.
@Morwenn lưu ý rằng mã này:
#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);
}
hoạt động trên GodBolt (nhưng sẽ không hoạt động trên máy của bạn - không có trình biên dịch phổ biến nào hỗ trợ điều này.)
Bạn là một luật sư ngôn ngữ? Ok, vậy cùng tham khảo chuẩn ..
Câu hỏi liệu nguồn chương trình C ++ có cần đến từ các tệp hay không không được trả lời rõ ràng trong tiêu chuẩn ngôn ngữ. Nhìn vào bản nháp của tiêu chuẩn C ++ 17 (n4713), phần 5.1 [lex.separate] đọc:
- Văn bản của chương trình được giữ trong các đơn vị được gọi là tệp nguồn trong tài liệu này. Một tệp nguồn cùng với tất cả các tiêu đề (20.5.1.2) và tệp nguồn được bao gồm (19.2) thông qua chỉ thị tiền xử lý #include, trừ đi bất kỳ dòng nguồn nào bị bỏ qua bởi bất kỳ chỉ thị tiền xử lý bao gồm có điều kiện (19.1) nào, được gọi là đơn vị dịch.
Vì vậy, mã nguồn không nhất thiết phải được giữ trong một tệp, nhưng trong một "đơn vị được gọi là tệp nguồn". Nhưng sau đó, bao gồm đến từ đâu? Người ta sẽ cho rằng chúng đến từ các tệp được đặt tên trên hệ thống tệp ... nhưng điều đó cũng không bắt buộc.
Ở bất kỳ mức độ nào, std::source_location
dường như không thay đổi từ ngữ này trong C ++ 20 hoặc ảnh hưởng đến cách diễn giải của nó (AFAICT).
__FILE__
. Lớpsource_location
chỉ cho phép bạn lấy nó tại trang web gọi hàm.