web-dev-qa-db-fra.com

C ++ 20 exige-t-il que le code source soit stocké dans des fichiers?

Une question un peu étrange, cependant, si je me souviens bien, le code source C++ ne nécessite pas de système de fichiers pour stocker ses fichiers.

Avoir un compilateur qui scanne les papiers manuscrits via une caméra serait une implémentation conforme. Bien que cela n'ait pratiquement pas beaucoup de sens.

Cependant, C++ 20 ajoute maintenant l'emplacement source avec file_name . Cela implique-t-il maintenant que le code source doit toujours être stocké dans un fichier?

105
JVApen

Non, le code source ne doit pas provenir d'un fichier (ni aller dans un fichier).

Vous pouvez compiler (et lier) C++ complètement dans un tube, en plaçant votre compilateur au milieu, par exemple.

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

et c'est comme ça depuis des décennies. Voir également:

L'introduction de std::source_location en C++ 20 ne change pas cet état de fait. C'est juste que certains codes n'auront pas un emplacement source bien défini (ou il peut être bien défini, mais pas très significatif). En fait, je dirais que l'insistance à définir std::source_location l'utilisation de fichiers est un peu myope ... bien qu'en toute honnêteté, c'est juste un équivalent sans macro de __FILE__ et __LINE__ qui existent déjà en C++ (et C).

@ HBv6 note que si vous imprimez la valeur de __FILE__ lors de la compilation à l'aide de GCC à partir du flux d'entrée standard:

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

exécution des impressions exécutables résultantes <stdin>.

Le code source peut même provenir d'Internet.

@Morwenn note que ce code:

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

fonctionne sur GodBolt (mais ne fonctionnera pas sur votre machine - aucun compilateur populaire ne le prend en charge.)

Êtes-vous un avocat spécialisé en langues? Ok, consultons donc la norme ..

La question de savoir si les sources de programme C++ doivent provenir de fichiers ne trouve pas de réponse claire dans la norme de langage. En examinant un projet de norme C++ 17 (n4713), la section 5.1 [Lex.separate] se lit comme suit:

  1. Le texte du programme est conservé dans des unités appelées fichiers sources dans ce document. Un fichier source avec toutes les en-têtes (20.5.1.2) et les fichiers source inclus (19.2) via la directive de prétraitement #include, moins toutes les lignes source ignorées par l'une des directives de prétraitement d'inclusion conditionnelle (19.1), est appelé une unité de traduction.

Ainsi, le code source n'est pas nécessairement conservé dans un fichier en soi, mais dans une "unité appelée fichier source". Mais alors, d'où viennent les inclusions? On pourrait supposer qu'ils proviennent de fichiers nommés sur le système de fichiers ... mais cela n'est pas non plus obligatoire.

À tout prix, std::source_location ne semble pas modifier cette formulation en C++ 20 ni affecter son interprétation (AFAICT).

107
einpoklum

Même avant C++ 20, la norme avait:

__FILE__

Nom présumé du fichier source actuel (un littéral de chaîne de caractères).

La définition est la même pour source_location::file_name.

En tant que tel, il n'y a pas eu de changement en ce qui concerne la prise en charge des implémentations sans système de fichiers en C++ 20.

La norme ne définit pas exactement ce que signifie "fichier source", donc s'il fait référence à un système de fichiers peut être à interpréter. Vraisemblablement, il pourrait être conforme pour une implémentation de produire "la note manuscrite que vous m'avez donnée à ce moment" si cela identifie bien le "fichier source" dans cette implémentation du langage.


En conclusion: Oui, les sources sont appelées "fichiers" par la norme, mais ce qu'est un "fichier" et si un système de fichiers est impliqué n'est pas spécifié.

52
eerorika