Nie, kod źródłowy nie musi pochodzić z pliku (ani przechodzić do pliku).
Możesz skompilować (i połączyć) C ++ całkowicie w potoku, umieszczając kompilator pośrodku, np
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
i tak jest od dziesięcioleci. Zobacz też:
Wprowadzenie std::source_location
w C ++ 20 nie zmienia tego stanu rzeczy. Po prostu jakiś kod nie będzie miał dobrze zdefiniowanej lokalizacji źródłowej (lub może być dobrze zdefiniowana, ale niezbyt znacząca). Właściwie, to powiedziałbym, że nacisk na definiowanie std::source_location
za pomocą plików jest nieco krótkowzroczny ... chociaż w sprawiedliwości, to jest po prostu mniej makro odpowiednik __FILE__
i __LINE__
które już istnieją w C ++ (i C).
@ HBv6 zauważa, że jeśli wypiszesz wartość __FILE__
podczas kompilacji przy użyciu GCC ze standardowego strumienia wejściowego:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
uruchamianie wynikowych wydruków wykonywalnych <stdin>
.
Kod źródłowy może nawet pochodzić z Internetu.
@Morwenn zauważa, że ten kod:
#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);
}
działa na GodBolt (ale nie będzie działać na twoim komputerze - żaden popularny kompilator tego nie obsługuje).
Czy jesteś prawnikiem językowym? Ok, więc zapoznajmy się ze standardem.
Na pytanie, czy źródła programów C ++ muszą pochodzić z plików, nie ma jednoznacznej odpowiedzi w standardzie językowym. Patrząc na szkic standardu C ++ 17 (n4713), sekcja 5.1 [lex.separate] brzmi:
- Tekst programu jest przechowywany w jednostkach zwanych plikami źródłowymi w tym dokumencie. Plik źródłowy wraz ze wszystkimi nagłówkami (20.5.1.2) i plikami źródłowymi (19.2) zawartymi przez dyrektywę preprocessingu #include, pomijając wszelkie linie źródłowe pominięte przez którąkolwiek z dyrektyw wstępnego przetwarzania warunkowego włączenia (19.1), nazywany jest jednostką tłumaczenia.
Zatem kod źródłowy niekoniecznie jest przechowywany w pliku jako takim, ale w „jednostce zwanej plikiem źródłowym”. Ale skąd się biorą dołączenia? Można by przypuszczać, że pochodzą z nazwanych plików w systemie plików ... ale to też nie jest wymagane.
W każdym razie std::source_location
nie wydaje się zmieniać tego sformułowania w C ++ 20 ani wpływać na jego interpretację (AFAICT).
__FILE__
. Klasasource_location
po prostu pozwala ci ją pobrać na stronie wywołania funkcji.