Ні, вихідний код не повинен надходити з файлу (ні переходити у файл).
Ви можете компілювати (і зв’язати) 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] говорить:
- Текст програми зберігається в одиницях, названих вихідними файлами в цьому документі. Вихідний файл разом із усіма заголовками (20.5.1.2) та вихідними файлами (19.2) через директиву про попередню обробку #include, за вирахуванням будь-яких джерельних рядків, пропущених будь-якими директивами попередньої обробки умовного включення (19.1), називається одиницею перекладу.
Отже, вихідний код не обов'язково зберігається у файлі сам по собі, а у "блоці, який називається вихідним файлом". Але тоді, звідки беруться включення? Можна припустити, що вони походять з названих файлів у файловій системі ... але це теж не доручено.
У будь-якому випадку, std::source_location
схоже, це зміна цього формулювання в C ++ 20 чи не вплине на його тлумачення (AFAICT).
__FILE__
. Класsource_location
просто дозволяє отримати його на сайті виклику функцій.