web-dev-qa-db-ja.com

C ++ 20は、ソースコードをファイルに保存することを義務付けていますか?

少し奇妙な質問ですが、私が正しく覚えていれば、C++ソースコードはファイルを保存するためにファイルシステムを必要としません。

カメラを介して手書きの紙をスキャンするコンパイラを使用することは、適合実装です。実際にはそれほど意味がありませんが。

ただし、C++ 20では file_name 。これは、ソースコードを常にファイルに保存する必要があることを意味していますか?

103
JVApen

いいえ、ソースコードはファイルから取得する必要はありません。

パイプ内で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]は次のとおりです。

  1. プログラムのテキストは、このドキュメントではソースファイルと呼ばれる単位で保持されます。ソースファイルとすべてのヘッダー(20.5.1.2)およびプリプロセスディレクティブ#includeを介して含まれるソースファイル(19.2)から、条件付きインクルード(19.1)プリプロセスディレクティブのいずれかによってスキップされるソース行を除いたものは、翻訳単位と呼ばれます。

そのため、ソースコードは必ずしもファイル自体に保存されるわけではなく、「ソースファイルと呼ばれるユニット」に保存されます。しかし、その後、インクルードはどこから来ますか?それらはファイルシステム上の名前付きファイルから来ていると思われますが、それも必須ではありません。

とにかく、_std::source_location_はC++ 20でこの表現を変更したり、解釈に影響を与えたりしないようです(AFAICT)。

105
einpoklum

C++ 20の前でさえ、標準には以下が含まれていました。

__FILE__

現在のソースファイルの推定名(文字列リテラル)。

定義はsource_location::file_nameでも同じです。

そのため、C++ 20でのファイルシステムなしの実装のサポートに関する変更はありません。

標準では、「ソースファイル」の意味が正確に定義されていないため、ファイルシステムを参照するかどうかは解釈次第です。おそらく、それが実際にその言語の実装で「ソースファイル」を識別する場合、「あなたがちょうど私に与えた手書きのメモ」を生成するために実装に適合している可能性があります。


結論として、ええ、ソースは標準では「ファイル」と呼ばれていますが、「ファイル」とは何か、ファイルシステムが関与しているかどうかは未指定です。

52
eerorika