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_location
en 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_location
uso 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:
- 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_location
no parece cambiar esta redacción en C ++ 20 ni afectar su interpretación (AFAICT).
__FILE__
. La clasesource_location
solo le permite obtenerla en el sitio de llamada de función.