参考:https://www.learncpp.com/cpp-tutorial/
-
完了すると、C++ でプログラミングする方法がわかるだけでなく、C++ でプログラミングしない方法もわかるようになります。これはおそらく同じくらい重要です。
-
疲れていたり不満を持っているプログラマーは間違いを犯し、コードのデバッグにはコードを正しく書くよりもはるかに時間がかかる傾向があります。
学習を最大限に高める方法
1. 手動で入力して自分でコンパイルすると、ミューテーションの警告やエラーにできるだけ早く慣れることができます。コードの各行の影響について考え、理解できない場合は詳しく調べてください。 2.
自分でバグを修正し、適応する方法を学ぶ
3. 例を試してみる パラメーターを変更して何が起こるかを確認します。
4. クイズに答えます
。 5. 学んだことを使用して自分でコーディングします。
プログラミング言語の概要
機械語。
CPU は直接読み取りと書き込みができ、0、1 で構成され、各 0/1 はビットです。コマンドを構成するビット数は異なる場合があります。一部の CPU 命令の長さは 32 ビットで、 CPU ごとに異なるため x86 変数になります。命令セットなので、あるタイプの CPU プログラムを別のタイプの CPU に移植することはできません
アセンブリ言語: 各命令は略語で表され、名前やその他の数字で表すことができます。機械語よりも読み書きが簡単ですが、理解するのが難しく、
異なる命令セットを備えたハードウェアで実行するには書き直す必要があります。
高級言語: 読みやすさと移植性の問題を解決するために、新しいプログラミング言語が開発されています。
コンパイル (C、C++、Pascal): ソース コードを読み取り、実行可能プログラムを生成します。
説明: 柔軟性は高くなりますが、効率は低くなります。実行可能ファイルにコンパイルせずに、命令を直接実行します。
(Java は両方を組み合わせて使用します)
C/C++ の概要:
C は、1972 年にベル電話研究所のデニス・リッチーによって主にシステム プログラミング言語 (オペレーティング システムを作成するために使用される言語) として開発されました。
C++ (「シー プラス プラス」と発音) は、C 言語の拡張としてベル研究所の Bjarne Stroustrup によって開発され、1979 年に始まりました。C++ は、C 言語に多くの新機能を追加したオブジェクト指向言語です。
C と C++ の基本的な設計哲学は、「プログラマを信頼する」という言葉に要約できますが、これは美しくもあり、危険でもあります。C++ は、プログラマーがやりたいことを自由に実行できるように設計されています。ただし、これは、言語が理解できない何らかの理由でそれを行っていると想定するため、通常、言語は意味のないことを行うのを止めないことを意味します。新しいプログラマーが不意を突くと陥る可能性のある落とし穴がたくさんあります。これが、C/C++ で何をしてはいけないかを知ることが、何をすべきかを知るのと同じくらい重要である主な理由の 1 つです。
C++ は何が得意ですか?
C++ は、メモリやその他のリソースの高いパフォーマンスと正確な制御が必要な状況に優れています。
電子ゲーム、リアルタイム システム、高性能金融アプリケーション (高頻度取引)
グラフィックス アプリケーションおよび
オフィス アプリケーション
組み込みソフトウェアのオーディオおよびビデオ処理
AI、ニューラル ネットワーク
C++ 開発環境の概要
1. 解決すべき問題を定義する
2. 問題を解決する方法を決定する
多くの場合、プログラマーはアイデアを思いつき、座ってすぐに解決策を書き始めます。これにより、多くの場合、望ましくないカテゴリに分類される解決策が生成されます。
一般に、優れたソリューションには次の特徴があります: 簡単、十分に文書化されている、モジュール構造、堅牢性、予期せぬ状況が発生したときに役立つ情報 座ってすぐにコーディングを開始すると、通常は「これを実行したい」と考え、ソリューションを実装できるようになります
。それがあなたの目標を最も早く達成します。その結果、プログラムが脆弱になったり、後で変更したり拡張したりすることが困難になったり、多数のバグ (技術的欠陥) が発生したりする可能性があります。
調査によると、プログラマーは実際に初期プログラムの作成に時間の 20% しか費やしていないことがわかっています。残りの 80% は、デバッグ (バグの削除)、環境の変化に対応するための更新 (新しいオペレーティング システム バージョンでの実行など)、機能拡張 (使いやすさや機能を向上させるための小さな変更)、または内部の改善などのメンテナンスに使用されます。 (信頼性または可用性を向上させるため)。保守性)。
したがって、(コーディングを開始する前に) もう少し時間をかけて、問題を解決する最善の方法、どのような仮定を立てているか、そして時間を大幅に節約し、将来の計画を立てる方法について考える価値があります。トラブル。
3.プログラムを書く
4. ソース コードをコンパイルし
、コードが C++ 構文規則に従っているかどうかを確認し、C+ ソース コードを機械語ファイル name.ojb に変換します。
5. オブジェクト ファイルとライブラリをリンクする
コンパイラによって生成されたすべてのファイルを取得し、単一の実行可能プログラムに結合します。
リンカは、オブジェクト ファイルをリンクするだけでなく、ライブラリ ファイルもリンクできます。(他のプログラムで再利用できるようにパッケージ化された、プリコンパイルされたコードのコレクション)
コア C++ 言語は、実際には非常に小さくて簡潔です (これらのチュートリアルで多くのことを学びます)。ただし、C++ には、C++ 標準ライブラリ (標準ライブラリと略されることが多い) と呼ばれる広範なライブラリも付属しており、プログラムで使用できる追加機能を提供します。C++ 標準ライブラリの最も一般的に使用される部分の 1 つは iostream ライブラリです。これには、ディスプレイにテキストを印刷したり、ユーザーからキーボード入力を取得したりするための関数が含まれています。C++ で書かれたほぼすべてのプログラムは、何らかの形式で標準ライブラリを使用するため、標準ライブラリがプログラムにリンクされるのが一般的です。ほとんどのリンカーは、標準ライブラリの一部を使用するとすぐに自動的にリンクします。
第三に、リンカーはすべてのファイル間の依存関係が正しく解決されることを保証します。たとえば、ある .cpp ファイルで何かを定義し、それを別の .cpp ファイルで使用すると、リンカーは 2 つを結合します。リンカーがその定義があるものに参照を接続できない場合、リンカー エラーが発生し、リンク プロセスは中止されます。
リンカーがすべてのオブジェクト ファイルとライブラリのリンクを完了すると (すべてがうまくいったと仮定して)、実行できる実行可能ファイルが作成されます。
リンクライブラリ
ライブラリは、アプリケーションにリンクして機能を共有および再利用できる、プリコンパイルされた再利用可能なコードのコレクションです。リンク ライブラリには通常、関数、クラス、データ構造などのコードとデータ リソースが含まれており、アプリケーションとリンクすることで、これらのライブラリが提供する関数をアプリケーションで呼び出すことができます。
リンク ライブラリには、主にスタティック リンク ライブラリとダイナミック リンク ライブラリの 2 つのタイプがあります。
静的ライブラリ:
静的リンク ライブラリは、コンパイル中にアプリケーションにリンクされて、独立した実行可能ファイルを形成します。これは、アプリケーションにリンクされたライブラリのすべてのコードとデータが含まれ、アプリケーションを独立して実行できることを意味します。
静的リンク ライブラリを使用する利点は、シンプルで便利であり、ランタイム環境への追加の依存関係を必要としないことです。ただし、ライブラリを使用する各アプリケーションがライブラリのコードとデータのコピーをコピーするため、コードが冗長になり、ファイル スペースが増加するという欠点があります。
ダイナミック リンク ライブラリ (DLL):
ダイナミック リンク ライブラリは実行時にメモリにロードされ、複数のアプリケーションがダイナミック リンク ライブラリの同じインスタンスを共有できます。これは、異なるアプリケーションが同じライブラリを共有できることを意味し、メモリのオーバーヘッドとディスク容量を削減します。
ダイナミック リンク ライブラリを使用する利点は、メモリとディスク領域を節約できると同時に、ダイナミック リンク ライブラリを更新することでライブラリ内の機能を修復および改善できることです。ただし、アプリケーションの実行時に対応するダイナミック リンク ライブラリ ファイルに依存する必要があるという欠点があり、このファイルが見つからない場合やバージョンが一致しない場合は、実行エラーが発生します。
リンク ライブラリはソフトウェア開発で広く使用されており、データベース操作、グラフィカル インターフェイス、ネットワーク通信などのさまざまな機能とサービスを提供できます。共通リンクライブラリには、標準ライブラリ(C++標準ライブラリ、C標準ライブラリなど)、サードパーティライブラリ(OpenCV、Boostなど)、オペレーティングシステムが提供するライブラリ(Windows APIなど)などが含まれます。
プロジェクトでリンクされたライブラリを使用するには、通常、ライブラリ ファイルをアプリケーションにリンクし、コード内で対応するヘッダー ファイルを参照して、ライブラリ内の関数とデータ構造にアクセスする必要があります。具体的な連携方法や参照方法は、開発環境やプログラミング言語によって異なります。
6.テスト
7.デバッグ
IDEの紹介
統合開発環境 (IDE)
Visual Studio (C++ デスクトップ開発、Windows 10 SDK (または Windows 11 SDK) を選択)
Code::Blocks (Linux または Windows の場合)
ブロック。Code::Blocks は、Linux および Windows 上で動作する、無料のオープンソースのクロスプラットフォーム IDE です。
一部の Linux インストールでは、Code::Block を使用してプログラムを実行またはコンパイルするために必要な依存関係が欠落している可能性があります。:sudo apt-get install build-essential。
Visual Studioコード
これは、高速で柔軟性があり、オープンソースであり、複数のプログラミング言語に適しており、さまざまなプラットフォームで利用できるため、経験豊富な開発者の間で人気があります。欠点は、VS Code はこのリストの他のオプションよりも正しく構成するのが難しいことです (Windows ではインストールもより困難です)。
最初のプログラムをコンパイルする
プロジェクト:
通常はプロジェクトから始まり、各プロジェクトはプログラムに対応します。
コンソール プロジェクト:
コンソール プロジェクトとは、Windows、Linux、または Mac コンソールから実行できるプログラムを作成することを意味します。
デフォルトでは、コンソール アプリケーションにはグラフィカル ユーザー インターフェイス (GUI) がなく、テキストをコンソールに出力し、キーボードからの入力を読み取り、スタンドアロンの実行可能ファイルにコンパイルします。
IDE のコンパイル、ビルド、リビルド、クリーン、および実行/起動オプションの違いは何ですか?
コード ファイルをコンパイルするときに、IDE は生成されたオブジェクト ファイルをキャッシュすることがあります。こうすることで、将来プログラムを再度コンパイルする場合、未変更のコード ファイルを再コンパイルする必要がなく、最後にキャッシュされたオブジェクト ファイルを再利用できます。これにより、コンパイル時間が大幅に短縮されます (ディスク容量が少し消費されます)。
ビルド: コンパイルされたプロジェクトまたはワークスペース/ソリューション内に変更されたすべてのコード ファイルを生成し、オブジェクト ファイルを実行可能ファイルにリンクします。前回のビルド以降にコード ファイルが変更されていない場合、このオプションは何も行いません。
クリーン: キャッシュされたオブジェクトと実行可能ファイルをすべて削除します。これにより、次回プロジェクトがビルドされるときにすべてのファイルが再コンパイルされ、新しい実行可能ファイルが生成されます。
リビルド:クリーン+ビルド
コンパイル: 単一のコード ファイルを (以前にキャッシュされているかどうかに関係なく) 再コンパイルします。このオプションは、リンカーを呼び出したり、実行可能ファイルを生成したりしません。
実行/開始: 前回のビルドで生成された実行可能ファイルを実行します。一部の IDE (Visual Studio など) は、最新バージョンのコードが実行されていることを確認するために、実行前にビルドします。
C++ に関する一般的な質問
一般的なランタイムの問題
- プログラムの実行中、コンソール ウィンドウが点滅し、すぐに閉じます。
まず、次の行をプログラムの先頭近くに追加するか、確認してください (Visual Studio ユーザーの場合は、これらの行が "pch.h" または #include " の後にあることを確認してください) stdafx.h" #include (存在する場合):
#include <iostream>
#include <limits>
次に、次のコードを main() 関数の最後 (return ステートメントの前) に追加します。
std::cin.clear(); // reset any error flags
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore any characters in the input buffer until we find an enter character
std::cin.get(); // get one more char from the user
これにより、プログラムは続行する前にユーザーがキーを押すまで待機するため、オペレーティング システムがコンソール ウィンドウを閉じる前にプログラムの出力を調べる時間ができます。
-
プログラムを実行するとウィンドウが表示されましたが、出力はありませんでした。
ウイルス スキャナーまたはマルウェア対策ソフトウェアが実行をブロックしている可能性があります。それが問題かどうかを確認するには、一時的に無効にしてみてください。 -
プログラムはコンパイルできますが、動作しません。私は何をしますか?
デバッグしてください
一般的なコンパイル時間の問題
-
プログラムをコンパイルすると、未解決の外部シンボル _main または _WinMain@16 に関するエラーが表示されます。
これは、コンパイラが main() 関数を見つけられないことを意味します。すべてのプログラムには main() 関数が含まれている必要があります。 -
C++11/14/17/XX の機能を使用しようとしていますが、機能しません。
コンパイラが古い場合、言語への最新の追加機能がサポートされていない可能性があります。この場合、コンパイラをアップグレードしてください。 -
cin、cout、または endl を使用しようとすると、コンパイラは、cin、cout、または endl が「宣言されていない識別子」であると表示します。
ファイルの先頭近くに次の行を必ず含めてください。
#include <iostream>
次に、cin、cout、および endl を使用するたびに「std::」という接頭辞が付いていることを確認してください。
std::cout << "Hello world!" << std::endl;
これでも問題が解決しない場合は、コンパイラが古いか、インストールが破損している可能性があります。コンパイラの再インストールや最新バージョンへのアップグレードを試してください。
-
endl を使用して出力行を終了しようとすると、コンパイラは、end1 は「宣言されていない識別子」であると表示します。endl の
文字 l (小文字の L) を数字 1 と間違えないように注意してください。endl はすべて文字です。エディターで、小文字の L、大文字の i、および数字の 1 の違いが明確にわかるフォントが使用されていることを確認してください。さらに、多くの非プログラミング フォントでは、大文字の o と数字の 0 が混同されやすいです。 -
プログラムのコンパイル時に「ファイルの終わりに改行がありません」エラーが発生する
C++ 標準では、すべてのソース (.cpp) ファイルが改行で終わることが要求されています。
C++ 標準では、すべてのソース (.cpp) ファイルが改行文字で終わることが必要です。
- c:\vcprojects\test.cpp(263) :致命的エラー C1010: プリコンパイルされたヘッダー ディレクティブの検索中に予期しないファイルの終わり
Microsoft Visual C++ コンパイラがプリコンパイル済みヘッダーを使用するように設定されているが、1 つ (または複数) の C++ コード ファイルがコード ファイルの最初の行として #include "stdafx.h" または #include "pch.h" を含まない場合、このエラーが発生します。推奨される回避策は、プリコンパイルされたヘッダーをオフにすることです。
- 「1MSVCRTD.lib(exe_winmain.obj) : エラー LNK2019: 関数「int __cdecl invoke_main(void)」で参照されている未解決の外部シンボル _WinMain@16 (?invoke_main@@YAHXZ)」
コンソール アプリケーションではなく Windows グラフィック アプリケーションを作成したことがあるかもしれません。プロジェクトを再作成し、それが Windows (または Win32) コンソール プロジェクトとして作成されていることを確認します。
- 「PDB ファイルが見つからないか、開けません」
これはエラーではなく警告であるため、プログラムには影響しません。しかし、これは面倒です。これを修正するには、[デバッグ メニュー] -> [オプションと設定] -> [シンボル] に移動し、「Microsoft Symbol Server」をチェックします。
コンパイラーの構成: ビルド構成
ビルド構成 (ビルド ターゲットとも呼ばれる) は、IDE がプロジェクトをビルドする方法を決定するプロジェクト設定のコレクションです。通常、ビルド構成には、実行可能ファイルの名前、IDE が他のコードおよびライブラリ ファイルを探すディレクトリ、デバッグ情報を保持するか削除するか、コンパイラにプログラムをどの程度最適化させるかなどが含まれます。通常、何かを変更する特別な理由がない限り、これらの設定はデフォルト値のままにしておきます。
IDE で新しいプロジェクトを作成する場合、ほとんどの IDE では、リリース構成とデバッグ構成という 2 つの異なるビルド構成がセットアップされます。
-
デバッグ構成はプログラムのデバッグを支援することを目的としており、通常はプログラムを作成するときに使用する構成です。この構成では、すべての最適化がオフになり、デバッグ情報が含まれるため、プログラムが大きくなり、速度が遅くなりますが、デバッグが容易になります。デフォルトでは、通常、デバッグ構成がアクティブな構成として選択されます。
-
リリース構成は、プログラムを一般にリリースするときに使用することを目的としています。このバージョンは通常、サイズとパフォーマンスが最適化されており、追加のデバッグ情報は含まれていません。リリース設定にはすべての最適化が含まれているため、このモードはコードのパフォーマンスをテストするのにも役立ちます。
ビルド構成を変更する:
プロジェクト設定を更新するたびに、すべてのビルド構成を変更します。
コンパイラの構成: コンパイラ拡張機能
コンパイラ拡張機能をオフにすることをお勧めします。
コンパイラ拡張機能を使用するプログラムを作成すると、C++ 標準と互換性のないプログラムを作成する可能性があります。非標準の拡張機能を使用するプログラムは、他のコンパイラ (同じ拡張機能をサポートしていない) ではコンパイルできないことが多く、コンパイルできる場合でも正しく実行されない可能性があります。
コンパイラの構成: 警告レベルとエラーレベル
プログラムを作成すると、コンパイラは C++ 言語のルールに従っていることを確認します。
言語の規則に明らかに違反することを行った場合、コンパイル中にコンパイラーはエラーを発行し、エラーを含む行番号と、予想された内容と見つかった内容に関するテキストを提供します。実際のエラーはこの行または前の行にある可能性があります。間違ったコード行を特定して修正した後、コンパイルを再試行できます。
また、コンパイラが間違っていると思われるコードを見つけても、それを判断できない場合もあります (「プログラマを信頼する」というモットーを思い出してください)。この場合、コンパイラは警告を発行することを選択できます。警告はコンパイルを停止するのではなく、何かが間違っていると思われることをプログラマに通知します。
ベスト プラクティス ベスト プラクティス:
警告が累積しないようにします。それらに遭遇したら、(バグであるかのように) 解決してください。そうしないと、重大な問題に関する警告が、重大でない問題に関する警告に紛れてしまう可能性があります。
まれに、問題のコード行に対して特定の警告を生成しないようにコンパイラーに明示的に指示する必要がある場合があります。
警戒レベルを上げる
デフォルトでは、ほとんどのコンパイラは、最も明白な問題についてのみ警告を生成します。ただし、コンパイラーが異常と判断したものについて、より自信を持って警告を提供するように依頼できます。
1. ソリューション エクスプローラー ウィンドウでプロジェクト名を右クリックし、[プロパティ] を選択します。
2. [プロジェクト] ダイアログ ボックスで、まず [構成] フィールドが [すべての構成] に設定されていることを確認します。
3. 次に、「C/C++ > 一般」タブを選択し、「警告レベル」を「レベル 4」(/W4) に設定します。
ベスト プラクティス ベスト プラクティス:
[警告をエラーとして扱う] を有効にします。これにより、警告の原因となっている問題を解決する必要があります。
[警告をエラーとして扱う] を [はい (/WX)] に設定します。
コンパイラーの構成: 言語標準の選択
利用可能な C++ バージョンは多数あります (C++98、C++03、C++11、C++14、C++17、C++20、C++23 など)。コンパイラどれを使用すればよいか知っていますか? 通常、コンパイラはデフォルトの標準を選択します。多くの場合、デフォルトは言語標準に準拠していません。多くのデフォルトは C++14 ですが、これには最新の優れた機能がほとんどありません。
別の言語標準を使用したい場合は (おそらくそうするでしょう)、そのように IDE/コンパイラを構成する必要があります。
言語標準のコード化された名前: 最終的な言語標準は、最終化された年に基づいて名前が付けられます (例: C++17 は 2017 年に最終化されました)。
どの言語標準を選択する必要がありますか?
プロフェッショナルな環境では、最新の標準より 1 つまたは 2 バージョン遅れた言語標準を選択するのが一般的です (たとえば、C++20 が最新バージョンの場合、これは C++14 または C++17 を意味します)。これは通常、コンパイラの製造元が欠陥を解決する機会を確保し、新機能のベスト プラクティスを完全に理解できるようにするために行われます。一部のプラットフォームのコンパイラは、新しい言語標準をすぐには完全にサポートしない可能性があるため、これは、必要に応じて、クロスプラットフォーム互換性の向上にも役立ちます。
言語標準を選択するには、プロジェクトを開いて [プロジェクト] メニュー > (アプリケーションの名前) [プロパティ] に移動し、次に [構成プロパティ] > [C/C++] > [言語] を開きます。
設定のエクスポート
新しいプロジェクトを作成するたびに、すべての設定オプションを再選択しなければならないのは面倒です。幸いなことに、ほとんどの IDE には設定をエクスポートする方法が用意されています。これは通常、必要な設定で新しいプロジェクト テンプレートを作成し、新しいプロジェクトの作成時にそのプロジェクト テンプレートを選択することによって行われます。
Visual Studio では、このオプションは [プロジェクト] -> [テンプレートのエクスポート] から利用できます。「プロジェクト テンプレート」を選択し、名前とオプションの説明 (C++20 コンソール アプリケーションなど) を追加して、「完了」をクリックします。次回新しいプロジェクトを作成するときに、このテンプレートがプロジェクト テンプレートのリストに表示されます。このテンプレートを使用して新しいプロジェクトを作成した後、ファイルを開けなくなる場合があります。.cpp ファイルは、ソリューション -> <プロジェクト名> -> ソース ファイル -> <テンプレート名>.cpp に移動することで、ソリューション エクスプローラー ウィンドウで開くことができます。
.cpp と .h ファイルの関係 以前のビルドから実行可能ファイルを実行/起動します。Visual Studio などの一部の IDE は、コードの最新バージョンが実行されていることを確認するために、「実行」を実行する前に「ビルド」を呼び出します。
C++ では、通常、コードの管理に .cpp ファイルと .h ファイル (または .hpp ファイル) の組み合わせが使用されます。ファイルを整理するこの方法は、多くの場合、個別コンパイルと呼ばれます。
.cpp ファイルには、実際のソース コード実装が含まれています。これには、クラスメソッドの定義、関数の特定の実装などが含まれます。
.h ファイル (または .hpp ファイル) は、クラス、構造体、関数の宣言が含まれるヘッダー ファイルです。通常、ヘッダー ファイルには、クラス メンバー関数のプロトタイプ、変数宣言、および必要なマクロ定義のみが含まれます。ヘッダー ファイルは、対応するソース ファイルへのインターフェイスとして考えることができます。
基本的に、.cpp ファイルには実装が含まれ、.h ファイルには宣言が含まれます。ヘッダー ファイルの目的は、実装の詳細を公開することなく、クラスや関数にアクセスするためのインターフェイスを他のソース ファイルに提供することです。
コンパイル プロセス中に、コンパイラは .cpp ファイルをオブジェクト ファイルにコンパイルし、複数のオブジェクト ファイルをリンクして実行可能ファイルを形成します。ヘッダー ファイル内の宣言は、コードの正確性を検証し、シンボルが正しく解決されることを確認するために使用されます。
したがって、.cpp ファイルと .h ファイルの関係は、.cpp ファイルには特定の実装が含まれ、.h ファイルにはインターフェイス宣言が含まれます。ヘッダー ファイルは #include 前処理ディレクティブによって導入されるため、コンパイル プロセス中に対応する宣言にアクセスできます。
OPENCV
構成環境
https://blog.csdn.net/ycx_ccc/article/details/123258001
エラー DLL が見つかりません
https://blog.csdn.net/op_chaos/article/details/114023937