C ++ 20は、ファイルに格納されるソースコードを義務付けていますか?


106

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

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

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


13
これは永遠にCで行われています- __FILE__。クラスはsource_location、関数呼び出しサイトで取得できるようにするだけです。
StaceyGirl

28
手書きの紙にファイル名をつけられませんか?
Jarod42

8
ソースコードがファイルにあるかどうかにかかわらず、実装の詳細だと思います。コンパイラーがstdinを介してソースコードを供給できる場合、ソースはデータベース内にある可能性があります。
Eljay

8
私の例は少しずれているかもしれませんが、TCCなどのオンザフライコンパイラを使用する場合、メモリから直接コンパイルする場合でも、エラー報告のために常に人間が読めるソース名を提供できます。つまり、「ファイル名」が付いていても、ファイルとして保存されることを意味するわけではありません。
user7860670

2
確かにそれ<iostream> は、開発者が作成したファイルではなく、(私が何を意味しているのかわかるとしたら)ファイルではない可能性があるような実装ファイルですか?

回答:


110

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

C ++をパイプ内で完全にコンパイル(およびリンク)して、コンパイラを途中で配置できます。

generate_source | g++ -o- -xc++ - | do_something_with_the_binary

そしてそれは何十年もそのようにされてきました。以下も参照してください。

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++  -

結果の実行可能ファイルを実行します<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)。


9
そのパイプは、標準の目的のための「ソースファイル」です。
メルポメン

5
「プログラムのテキストは、この国際標準では、ソースファイル(または前処理ファイル)と呼ばれる単位で保持されています。」と定義しているC標準を見ています。つまり、コードが保存されている場所はどこでも、それはStandardeseの「ソースファイル」です。(補遺:同様の言語は[lex]の下のC ++標準にあります。)
melpomene

8
@melpomene:ユニットは単に ソースファイルと呼ばれ、実際にソースファイルである必要はありません。ただし、これを含めるように回答を編集します。
einpoklum

13
GCCでこれを試したところ: "echo '#include <stdio.h> \ nint main(){printf("%s \\ n "、__FILE__); return 1;}' | gcc -o test -xc-"(引用符なし)。実行すると、<stdin>が出力されます。
HBv6

11
ここに、標準(および科学)の用語と名前および概念についての面白い点があります。それらは通常、アトミックです。つまり、「ソースファイル」は必ずしも「ソース」である「ファイル」であるとは限りません。実際、「ファイル」という用語は単に定義されていない可能性があります。数学の数値と比較してください。単に「」というものはありません数値」、「自然数」、「有理数」、「実数」などのみ
Joker_vD

53

C ++ 20の前でさえ、標準には以下がありました:

__FILE__

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

の定義はと同じですsource_location::file_name

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

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


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


2
@Yksisarvinenルールの「推定」修飾の意図は正確にはわかりませんが、ファイル名は絶対的または標準的である必要はなく、むしろ相対的な名前である必要があることが明確化されていると思います :)コンパイラで十分です。私は間違っている可能性があります。
eerorika

4
「左キャビネット、3番目の引き出し、4番目の赤いタブ付きフォルダ、17ページ」がscanner-c++返されるのがわかります
dmckee ---元モデレーターの子猫

2
FWIW、POSIXの意味では、パイプ(または他のファイルのようなもの)は「ファイル」です。つまり、stdin / stdoutは「ファイル」であり、この意味ではディスクファイルなどではありません。

3
@Yksisarvinen:委員会は、あいまいな実装がありふれた行動に反する何かをするのに十分な理由があるかもしれない状況を考慮に入れます。そうすることで、それはコンパイラの作者に依存して、彼らの顧客がありふれた振る舞いをいくつかの選択肢よりも有用であると感じるかどうかを判断します。そのようなことは実装者の判断に委ねられるという事実は「あいまいさ」と見なされるかもしれませんが、優れたコンパイラー作成者は委員会がこれまで以上に顧客のニーズについて知っているので、それは意図的なものです。
スーパーキャット

1
@dmckee ...使用されていないトイレで、ドアに「ヒョウに注意」と
Andrew Henle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.