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

静的に型付けされた自由形式のマルチパラダイムでコンパイルされた汎用プログラミング言語であるC ++に関する質問。

2
C ++メソッドを、ポインター引数を持つC関数に変換することは受け入れ可能なパターンですか?
ESP-32でC ++を使用しています。タイマーを登録するとき、私はこれをしなければなりません: timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback); timer_args.arg = this; ここでタイマーが呼び出しますsoundCallback。 タスクを登録するときも同じこと: xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle); そのため、メソッドは個別のタスクで開始されます。 GCCは常にこれらの変換について警告しますが、計画どおりに機能します。 量産コードでは受け入れられますか?これを行うためのより良い方法はありますか?
16 c++  c  functions 

3
インターフェイスでstring_viewを使用する必要があるのはいつですか?
私は模倣Aに設計された内部ライブラリを使用しているC ++ライブラリを提案し、いつか過去数年間で、私はそのインターフェースが使用してから変更を参照std::stringしますstring_view。 そこで、新しいインターフェースに適合するようにコードを忠実に変更しました。残念ながら、私が渡さなければならないのは、std :: stringパラメーターと、std :: string戻り値です。そのため、私のコードは次のように変更されました。 void one_time_setup(const std::string & p1, int p2) { api_class api; api.setup (p1, special_number_to_string(p2)); } に void one_time_setup(const std::string & p1, int p2) { api_class api; const std::string p2_storage(special_number_to_string(p2)); api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size())); } 私は、この変更がAPIクライアントとして私に何を買ったのか、実際には、コードを増やすこと以外は見当たらないでしょう(おそらく失敗するためです)。API呼び出しの安全性は低下し(APIがパラメーターのストレージを所有しなくなったため)、おそらくプログラム0の作業を節約しました(コンパイラーができる最適化の移動により)。起動後またはどこかで大きなループで行われない、または行われない割り当てがいくつかあります。このAPI用ではありません。 ただし、このアプローチは、他の場所で見られるアドバイス、たとえば次の回答に従うようです。 余談ですが、C ++ 17以降では、std :: string_viewを優先してconst std :: …

5
C ++での例外の慣用的な使用法
isocpp.org例外よくある質問の状態 関数の使用におけるコーディングエラーを示すために、throwを使用しないでください。assertまたはその他のメカニズムを使用して、プロセスをデバッガーに送信するか、プロセスをクラッシュさせて開発者がデバッグするためのクラッシュダンプを収集します。 一方、標準ライブラリはstd :: logic_errorとそのすべての派生物を定義します。これらは、他のことに加えてプログラミングエラーを処理することになっているように思えます。プログラミングエラーではなく、空の文字列をstd :: stof(invalid_argumentをスローします)に渡しますか?「1」/「0」以外の文字を含む文字列をプログラミングエラーではなくstd :: bitset(invalid_argumentをスローします)に渡しますか?プログラミングエラーではなく、無効なインデックス(out_of_rangeをスローします)でstd :: bitset :: setを呼び出していますか?そうでない場合、テストするプログラミングエラーは何ですか?std :: bitset文字列ベースのコンストラクタはC ++ 11以降にのみ存在するため、例外の慣用的な使用を念頭に置いて設計されている必要があります。一方、logic_errorは基本的にまったく使用すべきではないと言われました。 例外が頻繁に発生する別のルールは、「例外的な状況でのみ例外を使用する」です。しかし、ライブラリ関数はどのような状況が例外的であるかをどのように認識するのでしょうか?一部のプログラムでは、ファイルを開けないことは例外です。他の人にとっては、メモリを割り当てることができないことは例外ではないかもしれません。そして、その間に何百ものケースがあります。ソケットを作成できませんか?接続できない、またはソケットまたはファイルにデータを書き込むことができませんか?入力を解析できませんか?例外的かもしれませんが、そうでないかもしれません。関数自体は、一般的に間違いなく知ることができず、どの種類のコンテキストが呼び出されているのかわかりません。 だから、特定の機能に例外を使用するかどうかをどのように決定するのですか?実際には一貫性のある唯一の方法は、すべてのエラー処理に使用するか、または何もしないことです。標準ライブラリを使用している場合、その選択は私のために行われました。
16 design  c++  exceptions 

5
C ++:クラスはその依存関係を所有または観察する必要がありますか?
class Foobarを使用する(依存する)クラスがあるとしWidgetます。Widget古き良き時代では、woludはのフィールドとして宣言されるFoobarか、多態的な動作が必要な場合はスマートポインターとして宣言され、コンストラクタで初期化されます。 class Foobar { Widget widget; public: Foobar() : widget(blah blah blah) {} // or std::unique_ptr<Widget> widget; public: Foobar() : widget(std::make_unique<Widget>(blah blah blah)) {} (…) }; そして、私たちはすべて準備ができて完了です。残念ながら、今日は、Javaの子供たちはカップルとして、当然、彼らはそれを見たら、私たちを笑う、となりますFoobarとWidget一緒に。解決策は一見シンプルです。依存関係の注入を適用して、Foobarクラスから依存関係を構築します。しかし、その後、C ++は依存関係の所有権について考えるように強制します。3つのソリューションが思い浮かびます。 ユニークなポインター class Foobar { std::unique_ptr<Widget> widget; public: Foobar(std::unique_ptr<Widget> &&w) : widget(w) {} (…) } Foobarそれの唯一の所有権がWidgetそれに渡されると主張する これには次の利点があります。 パフォーマンスへの影響はごくわずかです。 FoobarコントロールのライフタイムがWidgetであるため、安全です。そのため、Widget突然消えることはありません。 Widget漏れることはなく、不要になったときに適切に破壊されます。 ただし、これにはコストがかかります。 Widgetインスタンスの使用方法に制限があります。たとえば、スタックに割り当てられたものWidgetsは使用Widgetできず、共有できません。 …

6
なぜプライベートメンバー関数をヘッダーに入れるのですか?
プライベートメンバー変数をC ++ヘッダーに配置する理由の答えは、コンパイラがスタック内を適切に移動するコードを生成できるように、インスタンスが宣言されたポイントでクラスのサイズを知る必要があるということです。 プライベートメンバーをヘッダーに配置する必要があるのはなぜですか? しかし、クラス定義でプライベート関数を宣言する理由はありますか? 代替案は、本質的にはくぼみのイディオムですが、余分な間接化はありません。 この言語機能は歴史的なエラー以上のものですか?
16 c++  history 

5
「チーム全体」のC ++機能
C ++では、例外などの機能はプログラム全体に影響します。プログラム全体でそれらを無効にするか、コード全体でそれらを処理する必要があります。有名な C ++報告書上の記事は、それを置きます: 直感に反して、コーディング例外の難しい部分は、明示的なスローとキャッチではありません。例外を使用することの本当に難しい部分は、任意の例外がスローサイトからハンドラーに伝播できるようにすべての介在コードを記述し、プログラムの他の部分を損傷することなく安全に到着することです。 さえがあるのでnew、例外をスローし、すべての機能が提供する必要がある基本的な例外安全性を - -それは唯一の例外をスローしない保証機能を呼び出しますしない限り、あなた無効に例外がない限り、完全にあなたの全体のプロジェクトでは。 したがって、例外は「プログラム全体」または「チーム全体」の機能です。それらは、それらを使用するチームの全員が理解する必要があるためです。しかし、私が知っている限り、すべてのC ++機能がそのようになっているわけではありません。 考えられる例は、テンプレートを取得していないが、使用していない場合でも、正しいC ++を作成できるかどうかということです。sort整数の配列を呼び出して、その驚くべき速度の利点を楽しむこともできます。Cのqsort(関数ポインターが呼び出されないため)バグを危険にさらすことなく、またはそうしませんか?テンプレートは「チーム全体」ではないようです。 コードを直接使用しないコードに影響を与え、したがって「チーム全体」である他のC ++機能はありますか?Cにはない機能に特に興味があります。 更新:私は特に、あなたがそれらに気づく必要がある言語強制サインがない機能を探しています。私が得た最初の答えはconst-correctnessであり、これもチーム全体であるため、誰もがそれについて学ぶ必要があります。ただし、AFAICSは、マークされた関数を呼び出した場合にのみ影響を与えconst、コンパイラは非constオブジェクトでの呼び出しを禁止するため、Googleに何かを提供します。例外を除いて、あなたはそれを得ることさえしません。さらに、を使用するとすぐに常に使用されるためnew、例外はより「邪魔」になります。ただし、これを客観的に表現することはできないため、チーム全体の機能に感謝します。 更新2:C ++機能の代わりに、大量のメインストリームプログラミング言語に適用されるマルチスレッドのようなものを除外するために、「C ++固有の機能」のようなものを書くべきでした。 付録:この質問が客観的である理由(疑問がある場合) C ++は複雑な言語であるため、多くのプロジェクトまたはコーディングガイドは「単純な」C ++機能を選択しようとし、多くの人々は主に主観的な基準に従って一部の機能を含めるか除外しようとします。それについての質問は、ここSOで定期的に閉じられます。 上記の代わりに、「可能な限り正確に」「全チーム」言語機能とは何かを定義し、C ++に関する文献の広範な裏付け証拠とともに例(例外)を提供し、C ++でチーム全体の機能を要求します。例外を超えて。 「チーム全体」の機能を使用するか、それが関連する概念であるかは主観的かもしれませんが、それはこの質問の重要性がいつものように主観的であることを意味します。

2
最新のC ++パラダイムの概要 [閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 私は8〜10年前にC ++を広範囲に記述していました。それ以来、専門的な理由でC#に移行しました。しかし、時々私は次のような声明を見ます 「まだポインタ参照を手動で追跡している場合は、間違っています」 または 「C ++は、RAIIのような最新のコンセプトを使用しており、回復中のC開発者のようにメモリを手動で割り当てない限り、完全に安全です。」 どちらも10年前の標準的な手順でした。最近、C ++がかなり改善されているのを見てきました。特にC ++ 0xには、いくつかの新しい機能があるようです。「C / old C ++」プログラマーが「最新」のC ++パターンとプラクティスに追いつくための最適なリソースは何ですか?

8
なぜC ++はまだ「ハイブリッド」なのか
関連する C ++は多くの点でCとの互換性はありませんなぜ疑問、それは明らかにされています。ただし、C ++は依然として「ハイブリッド」*言語です。残念ながら、多くのプログラマーはまだC ++を「ストリームと組み込み文字列を含むC」と見なしています。その結果、コードが非常に悪くなり、C ++でもCでもありません。IMHO、言語/コンパイラーがある程度プログラマーにより洗練されたコードを書くことを強制した方が良いでしょう。では、最新のC ++(たとえばC ++ 0xと将来のバージョン)をハイブリッドに保つ理由はありますか? *ハイブリッドとは、標準の文字列とストリーム、クラス、デフォルト以外の名前空間などを使用するかどうかを決定するのはプログラマ次第であることを意味します。

9
大規模なLinux / makefileプロジェクトに効果的に取り組む方法は?
私は10年ほど前からC ++でWindowsアプリケーションを開発しています。そして最近、私はいくつかのLinuxプロジェクトを掘り始めましたが、私がどれほど非生産的かは我慢できません... 私は早い学習者で、しばらくの間、Linuxを主要なプラットフォームとして使用しています。そして、シェル、OSの原則、GUIには非常に満足しています。しかし、開発に関しては、学校に戻ったように感じます。 より大きなプロジェクトを開くとすぐに行き詰まります。それらのほとんどはmakefileベースであるため、基本的にQTまたはCodeBlocksでナビゲートしようとすると、せいぜいファイルごとにインテリセンスを使用できます。そして、ほとんどの時間変数はスコープから漏れます。 次に、定義に移動するものがありますが、それは存在しないようで、sourceforgeからより大きなプロジェクトに参加しようとしますgrep -r "this_def" . --include "*.cpp" --include "*.h"。 そして、デバッグ、gdbは動作しますが、私が何をしても、WinDbgやVisualStudioデバッガーに遅れを取っているようです。 そして、これらのことは私を必死にし、コードを書きたいが、それはとても遅くなる...私はLinux開発者が関数定義を暗記し、コードを目で分析すると考え始めているが、それが信じられないそう。 誰もこれを経験しましたか?生産性を高めるために足りないものはありますか?
16 c++  linux 

8
C ++を使用し、言語固有の機能を使用しない場合、Cに切り替える必要がありますか?
趣味としてNESエミュレーターを開発しています。C ++を使用している理由は、私が主に使用している言語であり、ほとんどを知っており、ほとんどの言語が好きだからです。 しかし、プロジェクトにある程度前進したので、C ++の特定の機能をほとんど使用していないことに気付き、プレーンなCでも同じ結果を得ることができたはずです。テンプレート、演算子のオーバーロード、ポリモーフィズム、継承は使用しません。それで、あなたは何と言いますか?C ++のままにするか、Cで書き直す必要がありますか? パフォーマンスを上げるためにこれを行うことはありませんが、副作用として生じる可能性がありますが、それが必要ないのであれば、なぜC ++を使用する必要があるのでしょうか? 私が使用しているC ++の唯一の機能は、データとメソッドをカプセル化するクラスですが、構造体と関数でも同様に行うことができ、newとdeleteを使用していますが、mallocとfreeを使用することもできます関数へのポインタで達成できるコールバックのためだけに継承を使用します。 趣味のプロジェクトであり、締め切りがないので、書き直しが必要なオーバーヘッド時間と作業は問題ではなく、楽しいかもしれません。だから、質問はCまたはC ++ですか?
16 c++  c 

3
Boostライブラリの使用方法の学習を開始する場所
Boostは最近私が取り組んでいるプロジェクトで利用可能になりましたが、あまり経験がありません。ライブラリには非常に多くの部分と機能があるため、学習を始める場所を知るのは困難です-特に本番コードの作成中に学習しようとするので(だからあまり遅くなることはありません)。 誰かが一般的に、毎日のプログラミングで非常に役立つ3から5の機能をリストし、それらがなぜ役に立つのかを述べていただければ幸いです。それから私はそれらを学び始め、それらを使用することができます-それは少なくとも私に図書館で足場を与え、それを学び/それを適用し始める友好的な場所になります:) 前もって感謝します!
16 c++  boost 

12
JavaがC ++などの他の言語よりも移植性が高いと考えられるのはなぜですか?
ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 Java開発者向けの「各プラットフォーム用の特定のJREの作成」とC ++向けの「各プラットフォーム用のC ++コンパイラの作成」の違いは何ですか?
16 java  c++  portability 

5
GUIがどのように機能し、いつ使い始めるべきかを誰かが説明できますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 約1か月間C ++を学んでいますが、先に進む前に、この退屈な質問を片付けたいと思います。GUIとは何ですか? コマンドラインプログラミングは基本的なものであることがわかっていますが、GUIをいじるのは楽しいと思います。 他にも約300万の質問がありますが、それらを保存します:D
16 c++  gui 

4
g ++で-pedanticフラグを使用するかどうか
私はC ++を学んでおり、練習にはLinuxでg ++を使用しています。 プログラマーとして働いている人がg ++ -pedanticフラグを使用しているかどうか、また実世界でのその重要性を知りたいです。 他のコンパイラについてはどうですか、これも可能ですか?これは事実上の標準になりましたか? 配列定義の次元として非const式を使用することは違法であると著者が指摘しているC ++ Primerを読んでいるので興味があります。g++ではデフォルトで許可されています。そして、私が知らない他のことがあるかもしれません。
16 c++  gcc 

4
C / C ++コードのレベルを向上させる
私は現在3〜4年間プログラミングを行っており、初心者とは呼べないように感じていますが、このサイトで質問を読んで、WTFについて話していると思いますか?最近、プログラミングの本を手にしたときも同じように感じています。 私はいくつかの初期プログラミング本を読みました。C/ C ++に関するものとゲームに関するものです。私は、非常に基本的なAI、シリアル、TCP / IPインターフェースなど、より複雑なものをいくつか書きました。 私はゲームプログラマになることを計画していますが、最近、組み込みシステム(シリアルインターフェイス)で作業する機会を得た後、組み込みシステムにある程度興味を持ちました。 私が見つけることができる中間C ++の本はないので、導入と初心者の本を完了した後、学習を続けるための資料を見つけることは非常に難しいとわかりました。 私の知識とスキルを成長させ、向上させるためにどのようなアドバイスをしますか?特定のリソースをいただければ幸いです。
16 c++  c 

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