問題タブ [header-only]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ヘッダーのみのライブラリの静的データ
ヘッダーファイルのみで構成されるライブラリを開発しています。これまでのところ、クラスのみが含まれていますが、問題ありません。ただし、一部の関数を実装するには、ライブラリ内にライブラリ全体でアクセス可能な不変のデータ(つまり、クラスインスタンスデータではない)が必要になるようになりました。明らかに、グローバルデータをヘッダーファイルに入れることはできません。そうしないと、ヘッダーであるすべて#include
のコンパイルユニットにシンボルの定義があり、リンク時に複数の定義エラーが発生します。
static
関数内のデータを変数にしてそのデータへのポインターを返すだけで、ライブラリにコンパイルユニットを追加しなくても、クラスに静的データを含めることができる回避策を見つけたようです。
これは正常に機能しているように見えますが、ヘッダーファイルstatic
の関数の関数データがどうなるかわからないことを認めなければなりません。inline
この「ハック」には、#include
このヘッダーが独自のバージョンのを取得するすべてのコンパイルユニットなど、意図しない影響があるのではないかと思いarray
ます。コンパイラはどのようにそしてどこにそれを置くことを決定しますか?
また、これをシングルトンアンチパターンなどの実装に使用していないことにも注意してください。複数の関数が使用する必要のあるデータを格納するために使用しているだけです(そのため、それを使用する関数だけに含めることはできませんがstatic
、使用したとしても、同じ質問が表示されます)。
c++ - ヘッダーのみのライブラリの利点
ヘッダーのみのライブラリの利点は何ですか?また、実装を別のファイルに入れるのに反対する方法でそれを書くのはなぜですか?
c++ - waf を使用した C++ ヘッダーのみのライブラリ
こんにちは、waf (1.7.5) に完全に移行する前に、次の構造の単純なプロジェクトを作成しようとしました。
これはルートwscript
です:
これは次のapplication
wscript
とおりです。
これはlibrary1
wscript
(注: fortarget
の代わりにを使用してみました。また、 の機能を有効にしようとしました。)name
library1
cxx cxxshlib
library1
これは次のmain.cpp
とおりです。
そして、これは私が得るエラーです:
ヘッダーを含める方法を変更したくありませんが、そのためには、プロジェクトの設定方法を変更する必要があるようです。
ご意見をお寄せいただければ幸いです。ありがとうございます。
EDIT:解決しました、それは単なるタイプミスでした(inludes
代わりにincludes
andexport_inludes
の代わりにexport_includes
)。
c++ - ヘッダーのみの C++ アプリケーションの何が問題になっていますか?
次のようなヘッダーのみのレイアウトで C++ アプリケーションをコーディングしたいと思っています。
唯一の cpp ファイルがメイン ファイルになります。残りのコードはヘッダー ファイルに配置されます。
このアプローチに何らかのパフォーマンス上の問題があるかどうかを知りたいです。クラス宣言でメソッドを定義するとインライン化されることはわかっていますが、cpp ファイルが 1 つだけになるため、インライン メソッドが重複することはありません。パフォーマンスに焦点を当てて質問したいだけです。拡張性、読みやすさ、メンテナンスなどについて話しているのではありません。このアプローチで、パフォーマンスの問題を引き起こす可能性のある何かが欠けているかどうかを知りたいです。
ありがとう!
c++ - ヘッダーのみのプロジェクトから移行するには?
約 450 ファイル (3.6 MB) のヘッダーのみの C++ コード ベース (VS 2010、Eclipse、Makefile) があります。コンパイル時間が長い (4 分) ため、毎日の作業が難しくなり始めました。そのわずかな部分 (約 20%) はテンプレート化されていますが、その他はいくつかのテンプレート メソッドをあちこちに持つ単純なクラスです。80% を別ファイルに移行することを考えてい.cpp
ます.h
。
まず、すべてのテンプレート ファイルを から.h
に変更し.hpp
ます。それは範囲を定義します。その後、私は大量の手作業を見るだけです。Visual Assist のMove implementation to source機能の助けを借りて、おそらく。最後に、部分的なユニティ ビルド (5..20.cpp
ファイルのコンパイル単位) で考えていますが、それはすべての後に行うことができます。
約 360 個のファイルを手動で作業するよりも良い方法はありますか? スピードアップはありますか?
c++ - オプションのヘッダーのみのライブラリ
デフォルトではヘッダーのみではありませんNOLIB
が、マクロを定義するヘッダーのみのライブラリとして使用できるC++ ライブラリを作成したいと考えています。
私は2つのアプローチを見てきました:
- インライン定義
foo.h
foo.cc
- 「人工」テンプレート
foo.h
foo.cc
これらのアプローチの長所と短所は何ですか? より良いオプションはありますか?
c++ - ヘッダーのみのライブラリで動作する警告を取得できません
ヘッダーのみのライブラリを作成していますが、コンパイル中に表示される警告を取得したいと考えています。ただし、ライブラリを含む「メイン」プロジェクトの警告のみが表示され、ライブラリ自体の警告は表示されないようです。
含まれているライブラリの警告をコンパイラに強制的にチェックさせる方法はありますか?
MyHeaderOnlyLib.hpp
を使用して、CMakeスクリプトを介して見つけていfind_package
ます。CMake によって実行されるコマンドを確認したところ-I
、 ではなくが使用されてい-isystem
ます。
ライブラリを<...>
(/usr/include/
ディレクトリにある場合)またはローカルで"..."
.
c++ - ヘッダーのみのライブラリ設計 - インクルード ディレクティブ
#include
ヘッダーのみの C++11/14 ライブラリを作成していますが、ライブラリ ファイル間のディレクティブをどのように処理すればよいかわかりません。
#include
ユーザー指向のモジュール ヘッダー ファイルでできるだけ多くのディレクティブをグループ化する必要がありますか、それとも内部ファイルに必要なファイルを含める必要がありますか (同じインクルードを繰り返すこともあります)。
アプローチ A:
このアプローチでは、モジュール ヘッダー ファイルに必要なすべての依存関係が含まれてから、実装が含まれます。実装のヘッダー ファイルには、それ自体には何も含まれていません。
-
-
-
アプローチ B:
このアプローチでは、モジュール ヘッダー ファイルには実装ヘッダーのみが含まれます。実装ヘッダーに追加のインクルードが必要な場合は、ファイル自体が (再帰的に) インクルードされ、同じインクルードが繰り返されることがあります。
-
-
-
最善のアプローチは何ですか?
直感的には、同じインクルードを繰り返すことを避け、他のファイルの前にどのファイルをインクルードする必要があるかを明確にするため、アプローチ Aが最適だと思います。ただし、最大の欠点は、インクルード ディレクティブのない実装ファイルで、私の IDE ( QT-Creator ) で構文の強調表示が機能しなくなることです。
編集:
この質問は、 「意見に基づく」という理由で終了するように投票されました。ファイルを含む私のライブラリのような大規模なヘッダーのみのプロジェクトでは、多くのコンパイル時間がかかる可能性があるため、私は同意しません。したがって、アプローチ A はアプローチ B よりも速い場合もあれば、その逆の場合もあります。
c++ - ライブラリ設計: ユーザーが「ヘッダーのみ」と動的リンクのどちらかを決定できるようにしますか?
現在ヘッダーのみのC++ ライブラリをいくつか作成しました。私のクラスのインターフェースと実装の両方が同じ.hpp
ファイルに書かれています。
私は最近、この種のデザインはあまり良くないと考え始めました。
- ユーザーがライブラリをコンパイルして動的にリンクしたい場合、それはできません。
- コードの 1 行を変更するには、ライブラリに依存する既存のプロジェクトを完全に再コンパイルする必要があります。
私はヘッダーのみのライブラリの側面を本当に楽しんでいます#include
.
両方の長所を活かすことは可能ですか? つまり、ユーザーがライブラリをどのように使用したいかを選択できるようにします。ばかげたコンパイル時間を避けるために「動的リンク モード」でライブラリに取り組み、パフォーマンスを最大化するために完成品を「ヘッダーのみモード」でリリースするので、開発もスピードアップします。
論理的な最初のステップは、インターフェイスと実装.hpp
を.inl
ファイルに分割することです。
とはいえ、先に進む方法はわかりません。多くのライブラリLIBRARY_API
が関数/クラス宣言の先頭にマクロを追加するのを見てきました.ユーザーが選択できるようにするために、おそらく同様のものが必要でしょうか?
「...の複数定義」エラーを回避するために、すべてのライブラリ関数にinline
キーワードのプレフィックスが付けられています。キーワードはファイル内のマクロに置き換えられると思いますか? マクロは、「ヘッダーのみモード」の場合は解決され、「動的リンク モード」の場合は何も解決されません。LIBRARY_INLINE
.inl
inline