但是,一个有点奇怪的问题是,如果我没记错的话,C ++源代码不需要文件系统来存储其文件。
拥有一个可以通过相机扫描手写纸的编译器将是一个符合要求的实现。尽管实际上没有太大意义。
但是,C ++ 20现在使用添加了源位置file_name
。现在,这是否意味着源代码应始终存储在文件中?
但是,一个有点奇怪的问题是,如果我没记错的话,C ++源代码不需要文件系统来存储其文件。
拥有一个可以通过相机扫描手写纸的编译器将是一个符合要求的实现。尽管实际上没有太大意义。
但是,C ++ 20现在使用添加了源位置file_name
。现在,这是否意味着源代码应始终存储在文件中?
Answers:
您可以在管道中完全编译(和链接)C ++,将编译器置于中间,例如
generate_source | g++ -o- -xc++ - | do_something_with_the_binary
几十年来一直如此。也可以看看:
std::source_location
C ++ 20中的引入不会改变这种状况。只是有些代码没有明确定义的源位置(或者可能定义明确,但意义不大)。其实,我想说的是定义上的坚持std::source_location
使用的文件是有点近视......虽然在公平,它只是一个宏观相当于少的__FILE__
和__LINE__
这已经存在C ++(和C)。
@ HBv6指出,如果您__FILE__
在标准输入流中使用GCC进行编译时打印了值:
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);
}
可以在GodBolt上运行(但不能在您的计算机上运行-没有流行的编译器支持此功能。)
语言标准中并未明确回答C ++程序源是否需要来自文件的问题。查看C ++ 17标准(n4713)的草稿,第5.1节[lex.separate]如下:
- 程序的文本在本文档中以称为源文件的单元形式保存。通过预处理指令#include将源文件以及所有标头(20.5.1.2)和包含的源文件(19.2)以及任何有条件包含(19.1)预处理指令跳过的任何源行,称为翻译单元。
因此,源代码本身不一定保存在文件中,而是保存在“称为源文件的单元”中。但是,包含项从何而来?有人会假设它们来自文件系统上的命名文件...但是也不是强制性的。
无论如何,std::source_location
似乎并没有改变C ++ 20中的措辞或影响其解释(AFAICT)。
甚至在C ++ 20之前,该标准就具有:
__FILE__
当前源文件的假定名称(字符串文字)。
的定义与相同source_location::file_name
。
因此,在C ++ 20中对无文件系统实现的支持方面没有发生变化。
该标准并未确切定义“源文件”的含义,因此是否引用文件系统可能取决于解释。如果确实能识别该语言的实现中的“源文件”,则可能适合于实现“产生您刚刚给我的手写便笺”。
总结:是的,标准将源称为“文件”,但是未指定“文件”是什么以及是否涉及文件系统。
scanner-c++
返回“左柜子,第三个抽屉,第四个红色标签的文件夹,第17页”。
__FILE__
。类source_location
仅允许您在函数调用站点上获取它。