少し奇妙な質問ですが、私が正しく覚えていれば、C++ソースコードはファイルを保存するためにファイルシステムを必要としません。
カメラを介して手書きの紙をスキャンするコンパイラを使用することは、適合実装です。実際にはそれほど意味がありませんが。
ただし、C++ 20では file_name
。これは、ソースコードを常にファイルに保存する必要があることを意味していますか?
パイプ内でC++を完全にコンパイル(およびリンク)し、コンパイラーを中間に置くことができます。
_generate_source | g++ -o- -xc++ - | do_something_with_the_binary
_
そして、それは何十年もの間そうでした。こちらもご覧ください:
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);
}
_
GodBoltで動作します (ただし、マシンでは動作しません-これをサポートする一般的なコンパイラはありません。)
C++プログラムのソースをファイルから取得する必要があるかどうかの質問は、言語標準では明確に回答されていません。 C++ 17標準(n4713)のドラフトを見ると、セクション5.1 [Lex.separate]は次のとおりです。
- プログラムのテキストは、このドキュメントではソースファイルと呼ばれる単位で保持されます。ソースファイルとすべてのヘッダー(20.5.1.2)およびプリプロセスディレクティブ#includeを介して含まれるソースファイル(19.2)から、条件付きインクルード(19.1)プリプロセスディレクティブのいずれかによってスキップされるソース行を除いたものは、翻訳単位と呼ばれます。
そのため、ソースコードは必ずしもファイル自体に保存されるわけではなく、「ソースファイルと呼ばれるユニット」に保存されます。しかし、その後、インクルードはどこから来ますか?それらはファイルシステム上の名前付きファイルから来ていると思われますが、それも必須ではありません。
とにかく、_std::source_location
_はC++ 20でこの表現を変更したり、解釈に影響を与えたりしないようです(AFAICT)。
C++ 20の前でさえ、標準には以下が含まれていました。
__FILE__
現在のソースファイルの推定名(文字列リテラル)。
定義はsource_location::file_name
でも同じです。
そのため、C++ 20でのファイルシステムなしの実装のサポートに関する変更はありません。
標準では、「ソースファイル」の意味が正確に定義されていないため、ファイルシステムを参照するかどうかは解釈次第です。おそらく、それが実際にその言語の実装で「ソースファイル」を識別する場合、「あなたがちょうど私に与えた手書きのメモ」を生成するために実装に適合している可能性があります。
結論として、ええ、ソースは標準では「ファイル」と呼ばれていますが、「ファイル」とは何か、ファイルシステムが関与しているかどうかは未指定です。