c++ language-lawyer c++20 std-source-location

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



language-lawyer c++20 (2)

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 escanea 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 . ¿Esto implica ahora que el código fuente siempre debe almacenarse en un archivo?


No, el código fuente no tiene que venir de 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í por décadas. Ver también:

La introducción de std::source_location en C ++ 20 no cambia este estado de cosas. Es solo que algunos códigos no tendrán una ubicación de origen bien definida (o puede estar bien definida, pero no es muy significativa). En realidad, diría que la insistencia en definir std::source_location usando archivos es un poco miope ... aunque para ser justos, es solo un equivalente sin macro de __FILE__ y __LINE__ que ya existe en C ++ (y C).

@ HBv6 señala que si imprime el valor de __FILE__ cuando compila utilizando GCC desde la secuencia de entrada estándar:

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

ejecutando el ejecutable resultante imprime <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 un abogado de idiomas? Ok, entonces consultemos el estándar ...

La pregunta de si las fuentes del programa C ++ deben provenir de los archivos no se responde claramente en el lenguaje estándar. 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 de origen en este documento. Un archivo fuente junto con todos los encabezados (20.5.1.2) y los 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 per se, sino en una "unidad llamada archivo fuente". Pero entonces, ¿de dónde vienen las inclusiones? Uno supondría que provienen de archivos con nombre en el sistema de archivos ... pero eso tampoco es obligatorio.

En cualquier caso, std::source_location no parece cambiar esta redacción en C ++ 20 ni afectar su interpretación (AFAICT).


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

__FILE__

El supuesto nombre del archivo fuente actual (un literal de cadena de caracteres).

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 fuente", por lo que si se refiere a un sistema de archivos puede estar a la altura de la interpretación. Presumiblemente, podría conformarse con que una implementación produzca "la nota manuscrita que me diste en ese momento" si de hecho identifica el "archivo fuente" en esa implementación del lenguaje.

En conclusión: Sí, el estándar hace referencia a las fuentes como "archivos", pero no se especifica qué es un "archivo" y si un sistema de archivos está involucrado.