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] 内容如下:
- 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 中的这个措辞或影响它的解释。
一个有点奇怪的问题,但是,如果我没记错的话,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] 内容如下:
- 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 中的这个措辞或影响它的解释。