タグ付けされた質問 「c++」

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

13
C ++のvolatileキーワードはメモリフェンスを導入しますか?
volatile値が変更される可能性があることをコンパイラに通知することを理解していますが、この機能を実現するために、コンパイラはそれを機能させるためにメモリフェンスを導入する必要がありますか? 私の理解では、揮発性オブジェクトに対する一連の操作は並べ替えることができず、保持する必要があります。これは、いくつかのメモリフェンスが必要であり、これを回避する方法が実際にはないことを意味しているようです。私はこれを言うのは正しいですか? この関連する質問で興味深い議論があります ジョナサンウェイクリーは書いています: ...個別の揮発性変数へのアクセスは、それらが別々の完全な式で発生する限り、コンパイラーによって並べ替えることはできません...揮発性はスレッドセーフには役に立たないが、彼が与える理由ではありません。これは、コンパイラが揮発性オブジェクトへのアクセスを並べ替える可能性があるためではなく、CPUがそれらを並べ替える可能性があるためです。アトミック操作とメモリバリアにより、コンパイラとCPUの並べ替えが妨げられます これにデビッド・シュワルツ氏は返信コメントで: ... C ++標準の観点からは、コンパイラが何かを実行することと、コンパイラがハードウェアに何かを実行させる命令を発行することとの間に違いはありません。CPUが揮発性物質へのアクセスを並べ替える可能性がある場合、標準ではそれらの順序を保持する必要はありません。..。 ... C ++標準では、並べ替えの内容を区別していません。そして、CPUが観察可能な影響なしにそれらを並べ替えることができると主張することはできないので、それは問題ありません-C ++標準はそれらの順序を観察可能として定義しています。コンパイラーは、プラットフォームに標準が要求することを実行させるコードを生成する場合、プラットフォーム上のC ++標準に準拠しています。標準が揮発性物質へのアクセスを並べ替えないことを要求している場合、プラットフォームは揮発性物質を並べ替えることに準拠していません。..。 私のポイントは、C ++標準がコンパイラーによる個別の揮発性物質へのアクセスの並べ替えを禁止している場合、そのようなアクセスの順序はプログラムの観察可能な動作の一部であるという理論に基づいて、CPUが実行することを禁止するコードを発行することもコンパイラーに要求するということです。そう。この規格は、コンパイラーが行うことと、コンパイラーの生成コードがCPUに行うことを区別していません。 どちらが2つの質問をもたらします:どちらかが「正しい」ですか?実際の実装は実際に何をしますか?

5
符号付き/符号なしの比較
次のコードが指定された場所で警告を発行しない理由を理解しようとしています。 //from limits.h #define UINT_MAX 0xffffffff /* maximum unsigned int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ /* = 0x7fffffff */ int a = INT_MAX; //_int64 a = INT_MAX; // makes all warnings go away unsigned int b = UINT_MAX; bool c = false; if(a < …

6
std :: ifstreamを取得してLF、CR、およびCRLFを処理しますか?
特に興味がありistream& getline ( istream& is, string& str );ます。ifstreamコンストラクターに、すべての改行エンコーディングを内部で「\ n」に変換するように指示するオプションはありますか?呼び出してgetline、すべての行末を適切に処理できるようにしたいと思います。 更新:明確にするために、私はほとんどどこでもコンパイルでき、ほとんどどこからでも入力を受け取るコードを書きたいと思っています。'\ n'のない '\ r'を持つまれなファイルを含みます。ソフトウェアのユーザーの不便を最小限に抑えます。 この問題を回避するのは簡単ですが、すべてのテキストファイル形式を柔軟に処理するための、標準での正しい方法についてはまだ興味があります。 getline'\ n'までの全行を文字列に読み込みます。'\ n'はストリームから消費されますが、getlineはそれを文字列に含めません。これまでのところ問題ありませんが、文字列に含まれる「\ n」の直前に「\ r」がある可能性があります。 テキストファイルに見られる行末には3つのタイプがあります。「\ n」はUnixマシンでの従来の語尾であり、「\ r」は(私が思うに)古いMacオペレーティングシステムで使用され、Windowsはペア「\ r」を使用します。 '\ n'が続きます。 問題はgetline、文字列の最後に「\ r」が残ることです。 ifstream f("a_text_file_of_unknown_origin"); string line; getline(f, line); if(!f.fail()) { // a non-empty line was read // BUT, there might be an '\r' at the …
85 c++  ifstream  newline 


4
C ++ 11のthread_local変数は自動的に静的ですか?
これら2つのコードセグメントに違いはありますか? void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable } そして void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable } 裏話:元々、静的ベクトルV(いくつかの中間値を保持するために、関数に入るたびにクリアされます)とシングルスレッドプログラムがありました。プログラムをマルチスレッドプログラムに変えたいので、どういうわけかこの静的修飾子を取り除く必要があります。私の考えは、すべての静的オブジェクトをthread_localに変換し、他に何も心配しないことです。これは裏目に出ることができますか?

2
関数のインラインバージョンは、非インラインバージョンとは異なる値を返します
同じ関数の2つのバージョンが、一方がインラインでもう一方がインラインでないことだけが異なる場合、どうすれば異なる値を返すことができますか?これが私が今日書いたいくつかのコードですが、それがどのように機能するのかわかりません。 #include <cmath> #include <iostream> bool is_cube(double r) { return floor(cbrt(r)) == cbrt(r); } bool inline is_cube_inline(double r) { return floor(cbrt(r)) == cbrt(r); } int main() { std::cout << (floor(cbrt(27.0)) == cbrt(27.0)) << std::endl; std::cout << (is_cube(27.0)) << std::endl; std::cout << (is_cube_inline(27.0)) << std::endl; } すべての出力がに等しいと思います1が、実際にはこれを出力します(g ++ 8.3.1、フラグなし): 1 0 …
85 c++ 

4
未定義の動作を含むソースコードがコンパイラをクラッシュさせることは合法ですか?
未定義の振る舞いを呼び出す、不十分に記述されたC ++ソースコードをコンパイルしようとすると、(彼らが言うように)「何でも起こり得る」としましょう。 C ++言語仕様が「準拠」コンパイラで許容できると見なすものの観点から、このシナリオの「すべて」には、コンパイラのクラッシュ(またはパスワードの盗用、またはコンパイル時の誤動作やエラーアウト)が含まれますか。未定義の振る舞いの範囲は、結果の実行可能ファイルが実行されたときに何が起こり得るかに特に限定されていますか?

11
ファイル名からディレクトリ名を取得する
ファイル名(C:\ folder \ foo.txt)があり、アンマネージC ++でフォルダー名(C:\ folder)を取得する必要があります。C#では、次のようにします。 string folder = new FileInfo("C:\folder\foo.txt").DirectoryName; アンマネージC ++でファイル名からパスを抽出するために使用できる関数はありますか?
85 c++  file  directory 

9
1つのベクトルのみを使用する基準を使用して、2つのベクトルを同じ方法で並べ替えるにはどうすればよいですか?
1つのベクトルのみを使用する基準を使用して、2つのベクトルを同じ方法で並べ替えるにはどうすればよいですか? たとえば、同じサイズの2つのベクトルがあるとします。 vector<MyObject> vectorA; vector<int> vectorB; 次に、vectorAいくつかの比較関数を使用して並べ替えます。その並べ替えは並べ替えられましたvectorA。同じ並べ替えを適用するにはどうすればよいvectorBですか? 1つのオプションは、構造体を作成することです。 struct ExampleStruct { MyObject mo; int i; }; その後、ソートの内容が含まれているベクトルvectorAとvectorB、単一のベクターにジップアップ: // vectorC[i] is vectorA[i] and vectorB[i] combined vector<ExampleStruct> vectorC; これは理想的な解決策とは思えません。特にC ++ 11で他のオプションはありますか?
85 c++  c++11 

22
パスからファイル名を取得する
パスからファイル名を取得する最も簡単な方法は何ですか? string filename = "C:\\MyDirectory\\MyFile.bat" この例では、「MyFile」を取得する必要があります。拡張子なし。
85 c++  visual-c++ 

9
「システムに「aclocal-1.15」がありません」という警告を克服するにはどうすればよいですか?
githubでc ++プログラムを実行しようとしています。(次のリンクhttps://github.com/mortehu/text-classifierで入手可能) Macを持っていて、ターミナルで実行しようとしています。autoconfとautomakeをダウンロードしたと思いますが、よくわかりません。プログラムを実行するには、ターミナルの正しいフォルダに移動してから実行します ./configure && make しかし、エラーが発生します: 警告:「aclocal-1.15」がシステムにありません。'acinclude.m4'または 'configure.ac'または 'configure.ac'に含まれるm4ファイルを変更した場合にのみ必要です。'aclocal'プログラムはGNUAutomakeパッケージの一部です:http://www.gnu.org/software/automake 実行するには、GNU Autoconf、GNU m4、Perlも必要です:http : //www.gnu.org / software / autoconf http://www.gnu.org/software/m4/ http://www.perl.org/ make:*** [aclocal.m4]エラー127 私はxcodeとg ++、そしてcプログラムを実行するために必要なすべてのものを持っていますが、おそらく明らかなように、私はImが何をしているのかわかりません。 上記のリンクでプログラムを実行する最も簡単で簡単な方法は何ですか?readmeと使用例が付属していることはわかっていますが、それを機能させることはできません。

4
c ++ 0x:参照によりパラメーターとしてラムダを受け取る適切な方法
int->int参照によってラムダパラメーターを受け取る関数を定義する正しい方法は何ですか? void f(std::function< int(int) >& lambda); または void f(auto& lambda); 最後の形式が正当な構文であるかどうかはわかりません。 ラムダパラメーターを定義する他の方法はありますか?

7
sprintfと同等のC ++?
私はそれstd::coutがC ++と同等であることを知っていますprintf。にます。 C ++に相当するものは何sprintfですか?
85 c++  printf 

7
スタックメモリサイズがそれほど制限されているのはなぜですか?
ヒープにメモリを割り当てる場合、唯一の制限は空きRAM(または仮想メモリ)です。それはメモリのGbになります。 では、なぜスタックサイズがそれほど制限されているのですか(約1 Mb)?スタック上に本当に大きなオブジェクトを作成することを妨げる技術的な理由は何ですか? 更新:私の意図が明確でない可能性があります。スタックに巨大なオブジェクトを割り当てたくないので、より大きなスタックは必要ありません。この質問は純粋な好奇心です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.