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

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

4
共有オブジェクト(.so)、静的ライブラリ(.a)、DLL(.so)の違いは?
Linuxのライブラリに関していくつかの議論に参加しており、いくつかのことを確認したいと思います。 アプリケーションを構築するときにライブラリを使用する方法は2つあるというのは私の理解です(間違っている場合は修正してください。後で投稿を編集します)。 静的ライブラリー(.aファイル):リンク時に、ライブラリー全体のコピーが最終アプリケーションに入れられるため、ライブラリー内の関数は常に呼び出し側アプリケーションで使用できます。 共有オブジェクト(.soファイル):リンク時に、オブジェクトは対応するヘッダー(.h)ファイルを介してAPIに対して検証されるだけです。ライブラリは、実行時まで実際には使用されません。 静的ライブラリの明らかな利点は、アプリケーション全体を自己完結できることです。動的ライブラリの利点は、「。so」ファイルを置き換えることができることです(つまり、セキュリティのために更新する必要がある場合)バグ)ベースアプリケーションを再コンパイルする必要はありません。 どちらも「.so」ファイルですが、共有オブジェクトとダイナミックリンクライブラリ(DLL)を区別する人がいると聞いています。Linuxまたは他のPOSIX準拠OS(つまり、MINIX、UNIX、QNXなど)でのC / C ++開発に関して、共有オブジェクトとDLLの間に違いはありますか?(これまでのところ)1つの重要な違いは、共有オブジェクトは実行時に使用されるだけであり、アプリケーション内でdlopen()呼び出しを使用してDLLを最初に開く必要があるということです。 最後に、一部の開発者が「共有アーカイブ」について言及しているのを聞いたことがあります。これは、私の理解では静的ライブラリでもありますが、アプリケーションで直接使用されることはありません。代わりに、他の静的ライブラリが「共有アーカイブ」にリンクして、共有アーカイブから構築中の静的ライブラリに一部(すべてではない)の関数/リソースをプルします。 よろしくお願いします。 更新 これらの用語が私に提供された状況では、Linuxを学習する必要があるWindows開発者のチームが使用した事実上誤った用語でした。私はそれらを修正しようとしましたが、(正しくない)言語の規範が行き詰まりました。 共有オブジェクト:プログラムの起動時にプログラムに自動的にリンクされ、スタンドアロンファイルとして存在するライブラリ。ライブラリはコンパイル時にリンクリストに含まれます(つまりLDOPTS+=-lmylib、という名前のライブラリファイルの場合mylib.so)。ライブラリは、コンパイル時とアプリケーションの起動時に存在している必要があります。 静的ライブラリ:アプリケーションコードと、プログラムのビルド時にプログラムに自動的にリンクされるライブラリコード、および両方を含む最終バイナリを含む単一(大きい)アプリケーションのビルド時に実際のプログラム自体にマージされるライブラリメインプログラムとライブラリ自体は、単一のスタンドアロンバイナリファイルとして存在します。ライブラリは、コンパイル時にリンクリストに含まれます(つまりLDOPTS+=-lmylib、mylib.aという名前のライブラリファイルの場合)。ライブラリはコンパイル時に存在している必要があります。 DLL:基本的に共有オブジェクトと同じですが、ライブラリはコンパイル時にリンクリストに含まれるのではなく、dlopen()/ dlsym()コマンドを介してロードされるため、プログラムをコンパイルするためにライブラリがビルド時に存在する必要はありません。また、ライブラリは、dlopen/ dlsym呼び出しが行われたときにのみ必要になるため、アプリケーションの起動時またはコンパイル時に(必ずしも)存在する必要はありません。 共有アーカイブ:基本的に静的ライブラリと同じですが、「export-shared」フラグと「-fPIC」フラグを使用してコンパイルされます。ライブラリはコンパイル時にリンクリストに含まれます(つまりLDOPTS+=-lmylibS、という名前のライブラリファイルの場合mylibS.a)。2つの違いは、共有オブジェクトまたはDLLが共有アーカイブを独自のコードに静的にリンクし、共有オブジェクトの関数を他のプログラムで使用するだけでなく、他のプログラムで使用できるようにする場合に、この追加のフラグが必要になることです。 DLLの内部。これは、誰かが静的ライブラリを提供し、それをSOとして再パッケージ化したい場合に役立ちます。ライブラリはコンパイル時に存在している必要があります。 追加アップデート 「DLL」と「shared library」の違いは、私が当時働いていた会社での(怠惰で不正確な)口語表現(Windows開発者はLinux開発に移行せざるを得ず、用語は行き詰まっている)であり、上記の説明に忠実でした。 さらに、S「共有アーカイブ」の場合、ライブラリ名の後に続く「」リテラルは、その会社で使用されている規則であり、業界では一般的ではありませんでした。
273 c++  c  linux  dll  linker 


1
「int main(){(([](){})());}」は有効なC ++ですか?
最近、次の難解なコードに出くわしました。 int main(){(([](){})());} 次のように再フォーマットして、読みやすくします。 int main(){ (([](){})()); // Um... what?!?! } しかし、私(([](){})())は有効なコードがどうあるかについて頭をつかむことができません。 関数ポインタ構文のようには見えません。 オペレーターのオーバーロードのトリックにはなりません。コードはそのままコンパイルされます。 グーグルは、この全記号検索ではあまり役に立たなかった。ただし、Visual Studio 2010でコンパイルされ、何も出力されません。エラーも警告もありませんでした。したがって、有効なコードのように見えます。 私は、JavaScriptとC関数ポインター以外ではとても奇妙な有効なコードを見たことがありません。 これが有効なC ++であると誰かが説明できますか?
271 c++  c++11  lambda  syntax 



10
shared_ptrを参照または値のどちらで渡す必要がありますか?
関数がshared_ptr(boostまたはC ++ 11 STLから)取るとき、それを渡しますか? const参照: void foo(const shared_ptr<T>& p) または値によって: void foo(shared_ptr<T> p)? 最初の方法の方が速いのではないかと思います。しかし、これは本当に価値があるのですか、それとも他に問題がありますか? あなたが選択した理由を教えてください、または場合は、それが問題ではないと思う理由。
270 c++  c++11  boost  shared-ptr 

16
C ++にガベージコレクタがないのはなぜですか?
まず、ガベージコレクションのメリットがあるので、この質問はしていません。これを尋ねる私の主な理由は、Bjarne StroustrupがC ++にある時点でガベージコレクターが含まれると言ったことを知っていることです。 とはいえ、なぜ追加されていないのですか?C ++用のガベージコレクターはすでにいくつかあります。これは、「実行するより簡単に言う」タイプのものの1つにすぎませんか?それとも追加されていない(そしてC ++ 11では追加されない)理由は他にありますか? 相互リンク: C ++のガベージコレクター 明確にするために、C ++が最初に作成されたときにガベージコレクターがなかった理由を理解しています。コレクターを追加できないのはなぜですか。

8
C ++でグラフィカルユーザーインターフェイスを構築するにはどうすればよいですか?[閉まっている]
ここで何が質問されているのかを理解することは困難です。この質問は、あいまいで、あいまいで、不完全で、過度に広い、または修辞的であり、現在の形では合理的に回答することができません。再開できるようにこの質問を明確にするヘルプについては、ヘルプセンターに アクセスしてください。 8年前に閉鎖。 これまでのところ、私のC ++プログラムはすべてコマンドラインインターフェイスを使用しており、私が経験した他の唯一の言語は、GUIをサポートしないPHPです。 C ++でのグラフィカルユーザーインターフェイスプログラミングはどこから始めますか?どうすれば作成できますか?

23
プログラムが実行されているディレクトリを取得するにはどうすればよいですか?
C / C ++を使用してプログラムが実行されているディレクトリのフルパスを取得するための、プラットフォームに依存しない方法とファイルシステムに依存しない方法はありますか?現在の作業ディレクトリと混同しないでください。(clibやSTLのような標準的なライブラリでない限り、ライブラリを推奨しないでください。) (プラットフォーム/ファイルシステムに依存しない方法がない場合、特定のファイルシステムについてWindowsおよびLinuxで機能する提案も歓迎します。)
269 c++  c  working-directory 


11
なぜf(i = -1、i = -1)が未定義の動作なのですか?
私は評価違反の順序について読んでいて、私を困惑させる例を示しています。 1)スカラーオブジェクトの副作用が同じスカラーオブジェクトの別の副作用と比較してシーケンスされていない場合、動作は未定義です。 // snip f(i = -1, i = -1); // undefined behavior このコンテキストでiは、は明らかにスカラーオブジェクトです。 算術型(3.9.1)、列挙型、ポインター型、メンバー型へのポインター(3.9.2)、std :: nullptr_t、およびこれらの型のcv修飾バージョン(3.9.3)は、まとめてスカラー型と呼ばれます。 その場合、ステートメントがどのようにあいまいであるかはわかりません。最初または2番目の引数が最初に評価されるかどうかに関係なく、i最終的に-1、および両方の引数もであるように思え-1ます。 誰かが明確にしてもらえますか? 更新 私はすべての議論に本当に感謝しています。これまでのところ、@ harmicの回答は非常に気に入っています。一見しただけではわかりやすいにもかかわらず、このステートメントを定義する際の落とし穴と複雑さを明らかにしているからです。@ acheong87は、参照を使用するときに発生するいくつかの問題を指摘していますが、これは、この質問のシーケンスされていない副作用の側面とは直交していると思います。 概要 この質問はかなりの注目を集めたので、主なポイント/回答を要約します。まず、少し補足して、「なぜ」は密接に関連しているが微妙に異なる意味を持つ可能性があることを指摘します。つまり、「原因」、「理由」、および「目的」です。私は、答えが「なぜ」のそれらの意味のどれに対処したかによってグループ分けします。 何のために ここでの主な答えは、Paul Draperからのもので、Martin Jが同様の貢献をしましたが、それほど広くはありません。ポール・ドレイパーの答えは要約されます 動作が定義されていないため、未定義の動作です。 答えは、C ++標準の内容を説明するという点で、全体的に非常に優れています。また、f(++i, ++i);やなど、UBのいくつかの関連するケースも扱いますf(i=1, i=-1);。関連する最初のケースでは、最初の引数が必要かどうかi+1、2番目の引数が必要かどうか、i+2またはその逆が明確ではありません。2番目でiは、関数呼び出しの後に1か-1 かが明確ではありません。これらのケースはどちらも次のルールに該当するため、UBです。 スカラーオブジェクトの副作用が同じスカラーオブジェクトの別の副作用と比較してシーケンスされていない場合、動作は未定義です。 したがって、f(i=-1, i=-1)プログラマの意図が(IMHO)明白で明確であるにもかかわらず、同じ規則に該当するため、UBもです。 ポール・ドレイパーはまた、彼の結論でそれを明確にしています 動作が定義されているのでしょうか?はい。定義されましたか?番号。 「どのような理由/目的がf(i=-1, i=-1)未定義の動作として残されたのか?」 どのような理由/目的で C ++標準にはいくつかの見落とし(多分不注意)がありますが、多くの省略は十分な理由があり、特定の目的を果たします。目的は「コンパイラライターの仕事を簡単にする」または「コードを高速にする」のいずれかであることが多いことは承知していますが、主に UBのままにする正当な理由があるかどうかを知りたいと思っていましたf(i=-1, i=-1) 。 harmicとsupercatは、UBの理由を提供する主な答えを提供します。Harmicは、見かけ上アトミックな割り当て操作を複数の機械語命令に分割する可能性のある最適化コンパイラーと、それらの命令をさらにインターリーブして最適な速度にする可能性があることを指摘しています。これはいくつかの非常に驚くべき結果につながる可能性があります:i彼のシナリオでは-2になります!したがって、harmicは、操作がシーケンスされていない場合に、変数に同じ値を複数回割り当てると悪影響を与える可能性があることを示しています。 supercatは、本来あるf(i=-1, …

14
C ++コードを終了する方法
特定の条件が満たされた場合にC ++コードの実行を停止したいのですが、その方法がわかりません。したがって、いつでもifステートメントがtrueの場合は、次のようにコードを終了します。 if (x==1) { kill code; }
267 c++ 


30
「if」チェーンを回避する方法は?
私がこの疑似コードを持っていると仮定します: bool conditionA = executeStepA(); if (conditionA){ bool conditionB = executeStepB(); if (conditionB){ bool conditionC = executeStepC(); if (conditionC){ ... } } } executeThisFunctionInAnyCase(); 前の関数executeStepXが成功した場合にのみ、関数を実行する必要があります。いずれの場合も、executeThisFunctionInAnyCase関数は最後に呼び出す必要があります。私はプログラミングの初心者なので、非常に基本的な質問で申し訳ありません。ifコードの読みやすさを犠牲にして、そのような「コードのピラミッド」を生成する長いチェーンを回避する方法はありますか(C / C ++など)? executeThisFunctionInAnyCase関数呼び出しをスキップできれば、コードは次のように簡略化できます。 bool conditionA = executeStepA(); if (!conditionA) return; bool conditionB = executeStepB(); if (!conditionB) return; bool conditionC = executeStepC(); if (!conditionC) return; …

17
C ++での列挙型の前方宣言
私は次のようなことをやろうとしています: enum E; void Foo(E e); enum E {A, B, C}; コンパイラはこれを拒否します。私はグーグルをざっと見てみましたが、コンセンサスは「あなたにはできません」のようですが、なぜなのか理解できません。誰か説明できますか? 明確化2:私は、この列挙型を取得するクラスにプライベートメソッドがあり、列挙型の値を公開したくないため、これを行っています。たとえば、Eが次のように定義されていることを誰にも知られたくない enum E { FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X } プロジェクトXはユーザーに知らせたいものではないからです。 したがって、ヘッダーファイルにプライベートメソッドを置き、cppで内部的に列挙型を宣言し、ビルドされたライブラリファイルとヘッダーを人々に配布できるように、列挙型を転送宣言したかったのです。 コンパイラに関しては-それはGCCです。
265 c++  enums 

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