Tidak, kode sumber tidak harus berasal dari file (atau pergi ke file).
Anda dapat mengkompilasi (dan menautkan) C ++ sepenuhnya di dalam pipa, meletakkan kompiler Anda di tengah, mis
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
dan sudah seperti itu selama beberapa dekade. Lihat juga:
Pengenalan std::source_location
dalam C ++ 20 tidak mengubah keadaan ini. Hanya saja beberapa kode tidak akan memiliki lokasi sumber yang ditentukan dengan baik (atau mungkin terdefinisi dengan baik, tetapi tidak terlalu berarti). Sebenarnya, saya akan mengatakan bahwa desakan untuk mendefinisikan std::source_location
menggunakan file agak rabun ... meskipun dalam keadilan, itu hanya setara dengan makro __FILE__
dan __LINE__
yang sudah ada di C ++ (dan C).
@ HBv6 mencatat bahwa jika Anda mencetak nilai __FILE__
saat mengompilasi menggunakan GCC dari aliran input standar:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
menjalankan hasil cetakan yang dapat dieksekusi <stdin>
.
Kode sumber bahkan dapat berasal dari Internet.
@Morwenn mencatat bahwa kode ini:
#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);
}
berfungsi di GodBolt (tetapi tidak akan berfungsi di mesin Anda - tidak ada kompiler populer yang mendukung ini.)
Apakah Anda seorang pengacara bahasa? Ok, jadi mari kita konsultasikan standar ..
Pertanyaan apakah sumber program C ++ harus berasal dari file tidak dijawab dengan jelas dalam standar bahasa. Melihat draf standar C ++ 17 (n4713), bagian 5.1 [lex.separate] berbunyi:
- Teks program disimpan dalam unit yang disebut file sumber dalam dokumen ini. File sumber bersama dengan semua header (20.5.1.2) dan file sumber yang disertakan (19.2) melalui arahan preprocessing #include, dikurangi semua baris sumber yang dilewati oleh arahan praproses inklusi bersyarat (19.1), disebut unit terjemahan.
Jadi, kode sumber tidak harus disimpan dalam file itu sendiri, tetapi dalam "unit yang disebut file sumber". Tapi kemudian, dari mana asalnya? Seseorang akan berasumsi bahwa mereka berasal dari file bernama pada sistem file ... tetapi itu juga tidak diamanatkan.
Bagaimanapun, std::source_location
tampaknya tidak mengubah kata-kata ini di C ++ 20 atau mempengaruhi interpretasinya (AFAICT).
__FILE__
. Kelassource_location
hanya memungkinkan Anda mendapatkannya di situs panggilan fungsi.