Hayır, kaynak kodun bir dosyadan gelmesi (veya bir dosyaya gitmesi) gerekmez.
Derleyicinizi ortaya koyarak C ++ 'yı tamamen bir boru içinde derleyebilir (ve bağlayabilirsiniz), örn.
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
ve onlarca yıldır böyleydi. Ayrıca bakınız:
std::source_location
C ++ 20'nin tanıtımı bu durumu değiştirmez. Sadece bazı kodların iyi tanımlanmış bir kaynak konumu olmayacaktır (veya iyi tanımlanmış olabilir, ancak çok anlamlı olmayabilir). Aslında, std::source_location
dosyaları kullanarak tanımlama konusundaki ısrarın biraz miyop olduğunu söyleyebilirim ... ancak adalet içinde, bu sadece makro içermeyen bir eşdeğerdir __FILE__
ve __LINE__
C ++ (ve C) 'de zaten mevcuttur.
@ HBv6 __FILE__
, standart giriş akışından GCC kullanarak derleme yaparken değerini yazdırırsanız :
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
ortaya çıkan yürütülebilir baskıların çalıştırılması <stdin>
.
Kaynak kodu internetten bile gelebilir.
@Morwenn bu kodu not eder:
#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 üzerinde çalışır (ancak makinenizde çalışmaz - hiçbir popüler derleyici bunu desteklemez.)
Dil avukatı mısınız? Tamam, hadi standarda bakalım ..
C ++ program kaynaklarının dosyalardan gelmesi gerekip gerekmediği sorusu dil standardında net bir şekilde yanıtlanmamıştır. C ++ 17 standardının (n4713) taslağına bakıldığında, bölüm 5.1 [lex.separate] şunu okur:
- Programın metni, bu belgede kaynak dosyalar olarak adlandırılan birimler halinde tutulur. Ön işleme yönergesi #include aracılığıyla tüm üstbilgiler (20.5.1.2) ve dahil edilen kaynak dosyalar (19.2) ile birlikte bir kaynak dosyaya, koşullu dahil etme (19.1) ön işleme yönergelerinden herhangi biri tarafından atlanan kaynak satırları hariç, çeviri birimi denir.
Bu nedenle, kaynak kodu mutlaka bir dosyada değil, "kaynak dosyası adı verilen bir birimde" tutulur. Ama o zaman, içerikler nereden geliyor? Dosya sistemindeki adlandırılmış dosyalardan geldikleri varsayılır ... ama bu da zorunlu değildir.
Her halükarda, std::source_location
bu ifadeyi C ++ 20'de değiştirmiyor veya yorumunu (AFAICT) etkiliyor gibi görünmüyor.
__FILE__
. Sınıfsource_location
, onu işlev çağrı sitesinde almanıza izin verir.