¿C ++ 20 exige que el código fuente se almacene en archivos?

106

Sin embargo, una pregunta un poco extraña, si no recuerdo mal, el código fuente de C ++ no requiere un sistema de archivos para almacenar sus archivos.

Tener un compilador que escanee documentos escritos a mano a través de una cámara sería una implementación conforme. Aunque prácticamente no tiene mucho sentido.

Sin embargo, C ++ 20 ahora agrega la ubicación de origen con file_name. ¿Implica esto ahora que el código fuente siempre debe almacenarse en un archivo?

JVApen
fuente
13
Esto ha estado en C desde siempre - __FILE__. La clase source_locationsolo le permite obtenerla en el sitio de llamada de función.
StaceyGirl
28
¿No puede dar nombre de archivo a sus trabajos escritos a mano?
Jarod42
8
Creo que es un detalle de implementación si el código fuente está en archivos o algo más. Si el compilador se puede alimentar con código fuente a través de stdin, la fuente podría estar en una base de datos.
Eljay
8
Mi ejemplo puede estar un poco fuera de lugar, pero si usa algún compilador sobre la marcha, como TCC, siempre puede proporcionar un nombre de fuente legible por humanos para informar de errores, aunque compile directamente desde la memoria. Tener un "nombre de archivo" no implica que se almacene como un archivo en absoluto.
user7860670
2
Seguramente son los archivos de implementación como los <iostream> que pueden no ser archivos (si ve lo que quiero decir), ¿no los archivos escritos por los desarrolladores?

Respuestas:

110

No, el código fuente no tiene que provenir de un archivo (ni ir a un archivo).

Puede compilar (y vincular) C ++ completamente dentro de una tubería, colocando su compilador en el medio, por ejemplo

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

y ha sido así durante décadas. Ver también:

La introducción de std::source_locationen C ++ 20 no cambia esta situación. Es solo que algún código no tendrá una ubicación de origen bien definida (o puede estar bien definida, pero no muy significativa). En realidad, diría que la insistencia en definir el std::source_locationuso de archivos es un poco miope ... aunque para ser justos, es solo un equivalente sin macros __FILE__y __LINE__que ya existe en C ++ (y C).

@ HBv6 señala que si imprime el valor de __FILE__al compilar usando GCC desde el flujo de entrada estándar:

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

ejecutando las impresiones ejecutables resultantes <stdin>.

El código fuente incluso puede provenir de Internet.

@Morwenn señala que este código:

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

funciona en GodBolt (pero no funcionará en su máquina; ningún compilador popular lo admite).

¿Eres abogado de idiomas? Ok, entonces consultemos el estándar.

La pregunta de si las fuentes del programa C ++ deben provenir de archivos no se responde claramente en el estándar del lenguaje. Mirando un borrador del estándar C ++ 17 (n4713), la sección 5.1 [lex.separate] dice:

  1. El texto del programa se mantiene en unidades llamadas archivos fuente en este documento. Un archivo fuente junto con todos los encabezados (20.5.1.2) y archivos fuente incluidos (19.2) a través de la directiva de preprocesamiento #include, menos las líneas fuente omitidas por cualquiera de las directivas de preprocesamiento de inclusión condicional (19.1), se denomina unidad de traducción.

Por lo tanto, el código fuente no se guarda necesariamente en un archivo en sí, sino en una "unidad llamada archivo fuente". Pero entonces, ¿de dónde vienen las inclusiones? Uno asumiría que provienen de archivos con nombre en el sistema de archivos ... pero eso tampoco es obligatorio.

De todos modos, std::source_locationno parece cambiar esta redacción en C ++ 20 ni afectar su interpretación (AFAICT).

einpoklum
fuente
9
Esa tubería es un "archivo fuente" para los propósitos del estándar.
melpomene
5
Estoy mirando el estándar C, que define: "El texto del programa se mantiene en unidades llamadas archivos fuente (o archivos de preprocesamiento ) en este estándar internacional". Entonces, donde sea que se almacene el código, ese es un "archivo fuente" en Standardese. (Anexo: lenguaje similar se encuentra en el estándar C ++ bajo [lex].)
melpomene
8
@melpomene: Las unidades se llaman simplemente archivos fuente, no dice que realmente tengan que ser archivos fuente. Pero editaré la respuesta para incluir esto.
einpoklum
13
Intenté esto con GCC: "echo '#include <stdio.h> \ nint main () {printf ("% s \\ n ", __FILE__); return 1;}' | gcc -o test -xc -" ( sin comillas). Cuando se ejecuta, imprime <stdin>.
HBv6
11
Aquí hay algo curioso sobre los términos, nombres y conceptos en estándares (y ciencias): generalmente son atómicos. Es decir, "archivo fuente" no es necesariamente un "archivo" que sea "fuente", de hecho, el término "archivo" simplemente puede no estar definido; compárelo con números en las matemáticas: no existe tal cosa como un " número ", solo" número natural "," número racional "," número real ", etc.
Joker_vD
53

Incluso antes de C ++ 20, el estándar tenía:

__FILE__

El presunto nombre del archivo fuente actual (una cadena de caracteres literal).

La definición es la misma para source_location::file_name.

Como tal, no ha habido un cambio con respecto al soporte para implementaciones sin sistema de archivos en C ++ 20.

El estándar no define exactamente qué significa "archivo de origen", por lo que si se refiere a un sistema de archivos puede depender de la interpretación. Presumiblemente, podría ser adecuado que una implementación produzca "la nota manuscrita que me entregó en ese momento" si eso realmente identifica el "archivo fuente" en esa implementación del lenguaje.


En conclusión: Sí, las fuentes se denominan "archivos" según el estándar, pero no se especifica qué es un "archivo" y si hay un sistema de archivos involucrado.

eerorika
fuente
2
@Yksisarvinen No sé exactamente la intención de la calificación de "presunción" de la regla, pero supongo :) que es una aclaración de que el nombre del archivo debe ser absoluto o canónico, sino más bien un nombre relativo desde la perspectiva de el compilador es suficiente. Podría estar equivocado.
eerorika
4
Puedo ver scanner-c++regresar "Armario izquierdo, tercer cajón, cuarta carpeta con pestañas rojas, página 17" .
dmckee --- ex-moderador gatito
2
FWIW, en el sentido POSIX, una tubería (o cualquier otra cosa similar a un archivo) es un "archivo" - como tal, stdin / stdout son "archivos", pero no archivos de disco, etc. en este sentido.
3
@Yksisarvinen: El Comité a menudo hace concesiones para situaciones en las que las implementaciones oscuras pueden tener buenas razones para hacer algo contrario al comportamiento común. Al hacerlo, depende de los redactores del compilador para juzgar si sus clientes encontrarían el comportamiento común más o menos útil que alguna alternativa. El hecho de que tales cosas se dejen al juicio de los implementadores puede verse como una "ambigüedad", pero es deliberada, ya que los buenos redactores de compiladores sabrán más acerca de las necesidades de sus clientes que el Comité.
supercat
1
@dmckee ... en un baño en desuso con un letrero en la puerta que dice "Cuidado con el leopardo".
Andrew Henle