[解決済み] C++20はソースコードのファイル保存を義務付けていますか?
質問
少し奇妙な質問ですが、私の記憶が正しければ、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] にはこうあります。
- プログラムのテキストは、この文書ではソース ファイルと呼ばれる単位で保持されます。ソースファイルは、すべてのヘッダ (20.5.1.2) と前処理指令 #include によってインクルード (19.2) されたソースファイルから、前処理指令の条件付きインクルード (19.1) によってスキップされたソース行を除いたものを、翻訳ユニットと呼びます。
つまり、ソースコードは必ずしもファイルそのものではなく、ソースファイルという単位で管理されているのです。しかし、それならインクルードはどこから来るのでしょうか?ファイルシステム上の名前付きファイルから来るのだろうと思われますが、それも強制されるものではありません。
何はともあれ
std::source_location
は、C++20 でこの文言を変更したり、その解釈に影響を与えたりすることはないようです。
関連
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] なぜGCCは、速度の代わりにサイズに最適化すると、15-20%速いコードを生成するのですか?
-
[解決済み】C++でファクトリーメソッドパターンを正しく実装する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない