1. ホーム
  2. c++

[解決済み] C++20はソースコードのファイル保存を義務付けていますか?

2022-10-12 21:39:55

質問

少し奇妙な質問ですが、私の記憶が正しければ、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__ を使ってコンパイルした場合、標準入力ストリームから

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);
}

ゴッドボルトで動作する (ただし、あなたのマシンでは動作しないでしょう - 一般的なコンパイラはこれをサポートしていません)。

あなたは言語弁護士ですか?わかりました、では標準を参照してみましょう...

C++ のプログラム ソースがファイルから来る必要があるかどうかという疑問は、言語標準では明確に回答されていません。C++17 標準のドラフト (n4713) を見てみると、セクション 5.1 [lex.separate] にはこうあります。

  1. プログラムのテキストは、この文書ではソース ファイルと呼ばれる単位で保持されます。ソースファイルは、すべてのヘッダ (20.5.1.2) と前処理指令 #include によってインクルード (19.2) されたソースファイルから、前処理指令の条件付きインクルード (19.1) によってスキップされたソース行を除いたものを、翻訳ユニットと呼びます。

つまり、ソースコードは必ずしもファイルそのものではなく、ソースファイルという単位で管理されているのです。しかし、それならインクルードはどこから来るのでしょうか?ファイルシステム上の名前付きファイルから来るのだろうと思われますが、それも強制されるものではありません。

何はともあれ std::source_location は、C++20 でこの文言を変更したり、その解釈に影響を与えたりすることはないようです。