Чи зберігається у файлах вихідний код C ++ 20 мандатів?


106

Дещо дивне питання, однак, якщо я добре пам’ятаю, вихідний код C ++ не потребує файлової системи для зберігання своїх файлів.

Зробити компілятор, який сканує рукописні документи через камеру, було б відповідною реалізацією. Хоча практично не має такого великого сенсу.

Однак C ++ 20 тепер додає розташування джерела file_name. Чи означає це, що вихідний код завжди повинен зберігатися у файлі?


13
Це було в С відвіку - __FILE__. Клас source_locationпросто дозволяє отримати його на сайті виклику функцій.
StaceyGirl

28
Ви не можете дати ім’я файлу своїм рукописним паперам?
Jarod42

8
Я думаю, це деталізація реалізації, чи є вихідний код у файлах чи щось інше. Якщо компілятор може подавати вихідний код через stdin, джерело може бути в базі даних.
Eljay

8
Мій приклад може бути трохи відключений, але якщо ви використовуєте який-небудь підлітковий компілятор, наприклад, TCC, ви завжди можете надати якесь читабельне ім’я людини для повідомлення про помилки, навіть якщо ви компілюєте безпосередньо з пам'яті. Тобто наявність "імені файлу" зовсім не означає, що він взагалі зберігається як файл.
користувач7860670

2
Напевно це файли реалізації, такі як <iostream> , можливо, це не файли (якщо ви бачите, що я маю на увазі), а не файли, написані розробниками?

Відповіді:


110

Ні, вихідний код не повинен надходити з файлу (ні переходити у файл).

Ви можете компілювати (і зв’язати) 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] говорить:

  1. Текст програми зберігається в одиницях, названих вихідними файлами в цьому документі. Вихідний файл разом із усіма заголовками (20.5.1.2) та вихідними файлами (19.2) через директиву про попередню обробку #include, за вирахуванням будь-яких джерельних рядків, пропущених будь-якими директивами попередньої обробки умовного включення (19.1), називається одиницею перекладу.

Отже, вихідний код не обов'язково зберігається у файлі сам по собі, а у "блоці, який називається вихідним файлом". Але тоді, звідки беруться включення? Можна припустити, що вони походять з названих файлів у файловій системі ... але це теж не доручено.

У будь-якому випадку, std::source_locationсхоже, це зміна цього формулювання в C ++ 20 чи не вплине на його тлумачення (AFAICT).


9
Ця труба є "вихідним файлом" для цілей стандарту.
Мельпомена

5
Я дивлюся на стандарт C, який визначає: "Текст програми зберігається в одиницях, що називаються вихідними файлами (або попередньо обробляють файли ) в цьому Міжнародному стандарті." Отже, де б не зберігався код, це "вихідний файл" у Стандардесі. (Додаток: Аналогічні формулювання можна знайти в C ++ стандарту , згідно [закон].)
Мельпомена

8
@melpomene: Одиниці просто називаються вихідними файлами, це не говорить про те, що вони насправді повинні бути вихідними файлами. Але я відредагую відповідь, щоб включити цю.
einpoklum

13
Щойно спробував це з GCC: "echo '#include <stdio.h> \ nint main () {printf ("% s \\ n ", __FILE__); return 1;}' | gcc -o test -xc -" ( без лапок). При виконанні він друкує <stdin>.
HBv6

11
Ось дивна річ щодо термінів, назв та понять у стандартах (і науках): вони зазвичай атомні. Тобто "вихідний файл" не обов'язково є "файлом", який є "джерелом", насправді термін "файл" просто не може бути визначений - порівняйте з числами в математиці: не існує такого поняття, як просто " число ", лише" натуральна nmber "," раціональне число "," дійсне число "тощо
Joker_vD

53

Ще до C ++ 20 стандарт мав:

__FILE__

Імовірно ім'я поточного вихідного файлу (символьний рядок буквально).

Визначення те саме для source_location::file_name.

Таким чином, не відбулося жодних змін щодо підтримки для реалізацій без файлової системи в C ++ 20.

Стандарт не точно визначає, що означає "вихідний файл", тому, чи стосується він файлової системи, може бути інтерпретація. Імовірно, це може відповідати реалізації, щоб створити "рукописну замітку, яку ви мені дали саме тоді", якщо це дійсно ідентифікує "вихідний файл" у цій реалізації мови.


На закінчення: Так, джерела називаються "файлами" за стандартом, але що таке "файл" та чи є файлова система, не визначено.


2
@Yksisarvinen Я точно не знаю наміру кваліфікації правила "презумпції", але я припускаю :), що це уточнення, що назва файлу має бути абсолютним або канонічним, а скоріше відносною назвою з точки зору компілятора достатньо. Я можу помилитися.
eerorika

4
Я просто бачу scanner-c++повернення "Ліва шафа, третя скринька, четверта папка з червоними вкладками, стор. 17" .
dmckee --- кошеня колишнього модератора

2
FWIW, в POSIX-сенсі, труба (або будь-яка інша річ, що входить до файлів) - це "файл" - як такий, stdin / stdout є "файлами", тільки не дисковими файлами тощо в цьому сенсі.

3
@Yksisarvinen: Комітет часто враховує ситуації, коли незрозумілі впровадження можуть мати вагомі причини зробити щось протилежне звичній поведінці. Роблячи це, він покладається на авторів-компіляторів, щоб оцінити, чи вважають їх клієнти звичну поведінку більш-менш корисною, ніж якусь альтернативу. Той факт, що такі речі залишаються на судження виконавців, може розглядатися як "неоднозначність", але це навмисно, оскільки хороші автори-компілятори дізнаються більше про потреби своїх клієнтів, ніж Комітет міг коли-небудь.
Supercat

1
@dmckee ... у непридатній туалеті зі знаком на дверях із написом "Остерігайся леопарда".
Ендрю Генле
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.