C++20 是否强制将源代码存储在文件中?

Does C++20 mandate source code being stored in files?

一个有点奇怪的问题,但是,如果我没记错的话,C++ 源代码不需要文件系统来存储它的文件。

拥有一个通过相机扫描手写文件的编译器将是一个符合规范的实现。虽然实际上没有那么多意义。

但是,C++20 现在使用 file_name 添加源位置。这是否意味着源代码应始终存储在文件中?

甚至在 C++20 之前,该标准就有:

__FILE__

The presumed name of the current source file (a character string literal).

source_location::file_name的定义相同。

因此,在 C++20 中对无文件系统实现的支持没有变化。

该标准并未准确定义“源文件”的含义,因此它是否指代文件系统可能取决于解释。据推测,如果确实在该语言的实现中标识了“源文件”,那么它可能符合生成“你刚才给我的手写笔记”的实现。


结论:是的,标准将源称为“文件”,但未指定“文件”是什么以及是否涉及文件系统。

不,源代码不必来自文件(也不必转到文件)。

您可以在管道中完全编译(和 link)C++,将您的编译器放在中间,例如

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

几十年来一直如此。另见:

  • Is it possible to get GCC to read from a pipe?
  • How to make GCC output to stdout?

在 C++20 中引入 std::source_location 并没有改变这种情况。只是有些代码不会有明确定义的源码位置(或者可能定义明确,但意义不大)。实际上,我想说坚持使用文件定义 std::source_location 有点近视……尽管公平地说,它只是 __FILE____LINE__ 的无宏等价物,它们已经存在于 C++(和 C)中。

@HBv6 指出,如果使用 GCC 从标准输入流编译时打印 __FILE__ 的值:

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

运行 生成的可执行文件打印 <stdin>.

源代码甚至可以来自互联网。

@Morwenn 注意到这段代码:

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

works on GodBolt(但不会在您的机器上运行 - 没有流行的编译器支持它。)

您是语言律师吗?好吧,那我们来参考一下标准吧..

对于C++程序源是否需要来自文件的问题,语言标准中并没有明确回答。查看 C++17 标准 (n4713) 的草案,第 5.1 节 [lex.separate] 内容如下:

  1. The text of the program is kept in units called source files in this document. A source file together with all the headers (20.5.1.2) and source files included (19.2) via the preprocessing directive #include, less any source lines skipped by any of the conditional inclusion (19.1) preprocessing directives, is called a translation unit.

因此,源代码本身不一定保存在文件中,而是保存在“称为源文件的单元”中。但是,包含从何而来?人们会假设它们来自文件系统上的命名文件......但这也不是强制性的。

无论如何,std::source_location 似乎没有改变 C++20 中的这个措辞或影响它的解释。