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