Não, o código-fonte não precisa vir de um arquivo (nem ir para um arquivo).
Você pode compilar (e vincular) C ++ completamente dentro de um pipe, colocando seu compilador no meio, por exemplo
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
e tem sido assim há décadas. Veja também:
A introdução de std::source_location
em C ++ 20 não muda esse estado de coisas. Acontece que alguns códigos não terão um local de origem bem definido (ou podem ser bem definidos, mas não muito significativos). Na verdade, eu diria que a insistência em definir std::source_location
usando arquivos é um pouco míope ... embora para ser justo, é apenas um equivalente sem macro __FILE__
e __LINE__
que já existe em C ++ (e C).
@ HBv6 observa que se você imprimir o valor de __FILE__
ao compilar usando GCC a partir do fluxo de entrada padrão:
echo -e '#include <iostream>\n int main(){std::cout << __FILE__ ;}' | g++ -xc++ -
executando as impressões executáveis resultantes <stdin>
.
O código-fonte pode até vir da Internet.
@Morwenn observa 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 em GodBolt (mas não funciona em sua máquina - nenhum compilador popular suporta isso).
Você é advogado de línguas? Ok, então vamos consultar o padrão ..
A questão de saber se as origens do programa C ++ precisam vir de arquivos não é respondida claramente no padrão de linguagem. Olhando para um rascunho do padrão C ++ 17 (n4713), a seção 5.1 [lex.separate] diz:
- O texto do programa é mantido em unidades chamadas arquivos de origem neste documento. Um arquivo de origem junto com todos os cabeçalhos (20.5.1.2) e arquivos de origem incluídos (19.2) por meio da diretiva de pré-processamento #include, menos quaisquer linhas de origem ignoradas por qualquer uma das diretivas de pré-processamento de inclusão condicional (19.1), é chamado de unidade de tradução.
Portanto, o código-fonte não é necessariamente mantido em um arquivo em si, mas em uma "unidade chamada arquivo-fonte". Mas então, de onde vêm as inclusões? Alguém poderia supor que eles vêm de arquivos nomeados no sistema de arquivos ... mas isso também não é obrigatório.
De qualquer forma, std::source_location
não parece mudar esta redação em C ++ 20 ou afetar sua interpretação (AFAICT).
__FILE__
. A classesource_location
apenas permite que você acesse no local da chamada de função.