しかし、少し奇妙な質問ですが、私が正しく覚えていれば、C ++ソースコードでは、ファイルシステムにファイルを格納する必要はありません。
カメラを介して手書きの紙をスキャンするコンパイラーがあれば、適合実装になります。実際にはそれほど意味がありませんが。
ただし、C ++ 20はでソースの場所を追加しfile_name
ます。これは、ソースコードを常にファイルに保存する必要があることを意味しますか?
しかし、少し奇妙な質問ですが、私が正しく覚えていれば、C ++ソースコードでは、ファイルシステムにファイルを格納する必要はありません。
カメラを介して手書きの紙をスキャンするコンパイラーがあれば、適合実装になります。実際にはそれほど意味がありませんが。
ただし、C ++ 20はでソースの場所を追加しfile_name
ます。これは、ソースコードを常にファイルに保存する必要があることを意味しますか?
回答:
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]には次のように書かれています。
- プログラムのテキストは、このドキュメントではソースファイルと呼ばれる単位で保持されます。すべてのヘッダー(20.5.1.2)およびソースファイル(前処理ディレクティブ#includeを介してインクルード(19.2)されたソースファイルから、条件付きインクルード(19.1)前処理ディレクティブによってスキップされたソース行を除いたものを、変換単位と呼びます。
そのため、ソースコードは必ずしもファイル自体に保存されるわけではなく、「ソースファイルと呼ばれる単位」に保存されます。しかし、インクルードはどこから来るのでしょうか?ファイルシステムの名前付きファイルからのものであると想定する人もいますが、それも必須ではありません。
とにかくstd::source_location
、C ++ 20でこの表現を変更したり、その解釈に影響を与えたりしていないようです(AFAICT)。
C ++ 20の前でさえ、標準には以下がありました:
__FILE__
現在のソースファイルの推定名(文字列リテラル)。
の定義はと同じですsource_location::file_name
。
そのため、C ++ 20でのファイルシステムなしの実装のサポートに関して変更はありません。
標準は「ソースファイル」の意味を厳密に定義していないため、ファイルシステムを参照するかどうかは解釈次第かもしれません。おそらく、実装がその言語の実装の「ソースファイル」を実際に識別している場合、実装が「そのときに私に与えた手書きのメモ」を生成することは適合している可能性があります。
結論:ええ、ソースは標準で「ファイル」と呼ばれていますが、「ファイル」とは何か、ファイルシステムが関係しているかどうかは不明です。
scanner-c++
返されるのがわかります。
__FILE__
。クラスはsource_location
、関数呼び出しサイトで取得できるようにするだけです。