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
dans C ++ 20 ne change pas cet état de fait. C'est juste que certains codes n'auront pas d'emplacement source bien défini (ou il peut être bien défini, mais pas très significatif). En fait, je dirais que l'insistance sur la définition à l' std::source_location
aide de fichiers est un peu myope ... même si, en toute honnêteté, c'est juste un équivalent sans macro de __FILE__
et __LINE__
qui existe déjà en C ++ (et C).
@ HBv6 note que si vous affichez la valeur de __FILE__
lors de la compilation en utilisant GCC à partir du flux d'entrée standard:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
exécuter les 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é dans les langues? Ok, alors consultons la norme.
La question de savoir si les sources de programmes C ++ doivent provenir de fichiers n'est pas clairement répondue dans la norme de langage. En regardant un brouillon de la norme C ++ 17 (n4713), la section 5.1 [lex.separate] se lit comme suit:
- Le texte du programme est conservé dans des unités appelées fichiers source dans ce document. Un fichier source avec tous les en-têtes (20.5.1.2) et les fichiers source inclus (19.2) via la directive de prétraitement #include, moins 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 includes? On pourrait supposer qu'ils proviennent de fichiers nommés sur le système de fichiers ... mais cela n'est pas non plus obligatoire.
En tout cas, std::source_location
ne semble pas changer cette formulation en C ++ 20 ni affecter son interprétation (AFAICT).
__FILE__
. La classesource_location
vous permet simplement de l'obtenir sur le site d'appel de fonction.