C ++ 20 impone che il codice sorgente venga memorizzato nei file?


106

Una domanda un po 'strana, tuttavia, se ricordo bene, il codice sorgente C ++ non richiede un file system per memorizzare i suoi file.

Avere un compilatore che scansiona documenti scritti a mano tramite una fotocamera sarebbe un'implementazione conforme. Anche se praticamente non ha molto senso.

Tuttavia C ++ 20 ora aggiunge la posizione di origine con file_name. Questo ora implica che il codice sorgente debba essere sempre memorizzato in un file?


13
Questo è stato in C da sempre - __FILE__. Class source_locationti consente solo di ottenerlo sul sito della chiamata di funzione.
StaceyGirl

28
Non puoi dare il nome del file ai tuoi documenti scritti a mano?
Jarod42

8
Penso che sia un dettaglio di implementazione se il codice sorgente è nei file o qualcos'altro. Se il compilatore può essere alimentato con il codice sorgente tramite stdin, l'origine potrebbe essere in un database.
Eljay

8
Il mio esempio potrebbe essere un po 'strano, ma se usi un compilatore al volo, come TCC puoi sempre fornire un nome di sorgente leggibile dall'uomo per motivi di segnalazione degli errori anche se compili direttamente dalla memoria. Avere un "nome file" non implica affatto essere archiviato come file.
user7860670

2
Sicuramente sono i file di implementazione come quelli <iostream> che potrebbero non essere file (se vedi cosa intendo), non i file scritti dagli sviluppatori?

Risposte:


110

No, il codice sorgente non deve provenire da un file (né andare a un file).

Puoi compilare (e collegare) C ++ completamente all'interno di una pipe, mettendo il tuo compilatore nel mezzo, ad es

generate_source | g++ -o- -xc++ - | do_something_with_the_binary

ed è stato così per decenni. Guarda anche:

L'introduzione di std::source_locationin C ++ 20 non cambia questo stato di cose. È solo che parte del codice non avrà una posizione di origine ben definita (o potrebbe essere ben definita, ma non molto significativa). In realtà, direi che l'insistenza sulla definizione di std::source_locationfile usando è un po 'miope ... anche se in tutta onestà, è solo un equivalente senza macro di __FILE__e __LINE__che già esistono in C ++ (e C).

@ HBv6 nota che se si stampa il valore di __FILE__durante la compilazione utilizzando GCC dal flusso di input standard:

echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++  -

eseguendo le stampe eseguibili risultanti <stdin>.

Il codice sorgente può anche provenire da Internet.

@ Morwenn nota che questo codice:

#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);
}

funziona su GodBolt (ma non funzionerà sulla tua macchina - nessun compilatore popolare lo supporta).

Sei un avvocato linguistico? Ok, quindi consultiamo lo standard ..

La domanda se i sorgenti del programma C ++ debbano provenire da file non trova una risposta chiara nello standard del linguaggio. Guardando una bozza dello standard C ++ 17 (n4713), la sezione 5.1 [lex.separate] si legge:

  1. Il testo del programma è contenuto in unità chiamate file sorgente in questo documento. Un file sorgente insieme a tutte le intestazioni (20.5.1.2) e ai file sorgente inclusi (19.2) tramite la direttiva di pre-elaborazione #include, meno qualsiasi riga di sorgente saltata da una qualsiasi delle direttive di pre-elaborazione di inclusione condizionale (19.1), è chiamato unità di traduzione.

Quindi, il codice sorgente non è necessariamente conservato in un file di per sé, ma in una "unità chiamata file sorgente". Ma allora, da dove vengono gli include? Si potrebbe presumere che provengano da file con nome sul filesystem ... ma anche questo non è obbligatorio.

In ogni caso, std::source_locationnon sembra cambiare questa formulazione in C ++ 20 o influenzare la sua interpretazione (AFAICT).


9
Quella pipe è un "file sorgente" ai fini dello standard.
melpomene

5
Sto guardando lo standard C, che definisce: "Il testo del programma è conservato in unità chiamate file sorgente , (o file di preelaborazione ) in questo standard internazionale". Quindi, ovunque il codice sia memorizzato, questo è un "file sorgente" in Standardese. (Addendum: linguaggio simile si trova nello standard C ++ sotto [lex].)
melpomene

8
@melpomene: le unità sono chiamate solo file sorgente, non dice che in realtà devono essere file sorgente. Ma modificherò la risposta per includerla.
einpoklum

13
Ho appena provato con GCC: "echo '#include <stdio.h> \ nint main () {printf ("% s \\ n ", __FILE__); return 1;}' | gcc -o test -xc -" ( senza virgolette). Quando viene eseguito, stampa <stdin>.
HBv6

11
Ecco una cosa divertente sui termini, i nomi e i concetti negli standard (e nelle scienze): di solito sono atomici. Cioè, "file sorgente" non è necessariamente un "file" che è "sorgente", infatti, il termine "file" potrebbe semplicemente non essere definito - confrontalo con i numeri in matematica: non esiste qualcosa come solo un " numero ", solo" numero naturale "," numero razionale "," numero reale ", ecc.
Joker_vD

53

Anche prima del C ++ 20, lo standard aveva:

__FILE__

Il presunto nome del file sorgente corrente (una stringa di caratteri letterale).

La definizione è la stessa per source_location::file_name.

Pertanto, non è stata apportata alcuna modifica al supporto per le implementazioni senza file system in C ++ 20.

Lo standard non definisce esattamente cosa significhi "file sorgente", quindi se si riferisce a un file system può essere interpretato. Presumibilmente, potrebbe essere conforme per un'implementazione produrre "la nota scritta a mano che mi hai dato proprio in quel momento" se questo identifica effettivamente il "file sorgente" in quell'implementazione del linguaggio.


In conclusione: Sì, le fonti sono indicate come "file" dallo standard, ma cosa sia un "file" e se sia coinvolto un file system non è specificato.


2
@Yksisarvinen Non conosco esattamente l'intenzione della qualifica "presunzione" della regola, ma presumo :) che sia un chiarimento che il nome del file deve essere assoluto o canonico, ma piuttosto un nome relativo dal punto di vista di il compilatore è sufficiente. Potrei sbagliarmi.
eerorika

4
Riesco solo a vedere il scanner-c++ritorno "Armadio a sinistra, terzo cassetto, quarta cartella con schede rosse, pagina 17" .
dmckee --- gattino ex moderatore

2
FWIW, nel senso POSIX, una pipe (o qualsiasi altra cosa file-ish) è un "file" - in quanto tale, stdin / stdout sono "file", solo non file su disco ecc. In questo senso.

3
@Yksisarvinen: Il Comitato spesso tiene conto delle situazioni in cui oscure implementazioni potrebbero avere buone ragioni per fare qualcosa di contrario al comportamento comune. In tal modo, si affida agli autori di compilatori per giudicare se i loro clienti troverebbero il comportamento comune più o meno utile di qualche alternativa. Il fatto che queste cose siano lasciate al giudizio degli implementatori può essere visto come un '"ambiguità", ma è deliberato, dal momento che i bravi autori di compilatori sapranno più sulle esigenze dei loro clienti di quanto il Comitato possa mai fare.
supercat

1
@dmckee ... in un gabinetto in disuso con un cartello sulla porta che dice "Attenti al leopardo".
Andrew Henle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.