問題タブ [one-definition-rule]

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.

0 投票する
2 に答える
378 参照

.net - 1 つの定義ルールを実装する方法

この投稿は、One Definition Rule への参照です。

ウィキペディアは、それを実装する方法を説明するのがかなり下手です

C++ .NET で従うべきガイドラインに関する適切なリソースはどこにありますか?

0 投票する
2 に答える
8140 参照

c++ - 信じられないほど高速な C++ デリゲートとさまざまな翻訳単位

Sergey Ryazanov によると、彼の信じられないほど高速な C++ デリゲートは比較できません。

私の代理人は比較できません。デリゲートにはメソッドへのポインターが含まれていないため、比較演算子は定義されていません。スタブ関数へのポインターは、さまざまなコンパイル単位で異なる場合があります。

読者はどれに答えましたか:

「スタブ関数へのポインターは、さまざまなコンパイル単位で異なる場合があります。」私の知る限り、これは真実ではありません。コンパイラは、異なるコンパイル単位で生成されたテンプレート関数を再利用する必要があります (これは確かですが、Borland はかつてこの規則に違反したと思います)。クラス(「名前のない」名前空間にないクラス)が外部リンケージを使用し、スタブ関数の使用方法が常にインライン化を妨げるためだと思います(ただし、関数のアドレスを取得するため、これは問題にはなりません非インライン バージョンが強制的に生成され、リンカーによって実行される「外部リンケージ」により、類似した名前の関数が 1 つを除いてすべて削除されます (それらは標準によって同一であると想定され、要求されます)...

テンプレート関数を 1 つの翻訳単位 (cpp ファイル) で定義し、同じ関数を別の翻訳単位で別の方法で定義すると、2 つのバージョンのうち 1 つのみが最終的な実行可能ファイルになります。(これは実際には「1 つの定義規則」に違反しますが、少なくとも GCC では動作します... MSVC については不明です。) 要点: [スタブの] アドレスは異なるユニットで同じになります。

これが MSVC に当てはまると思われる場合は、(比較機能を含めて) 記事を更新することをお勧めします。MSVC がこの点で標準の授与である場合。

現在、この記事は 4 年前に作成されており、著者は過去 3 年ほどコメントに返信していないため、上記のコメントにメリットがあるかどうか、およびこの特定の実装を実際に変更できるかどうか疑問に思っています。比較をサポートします。

C++ 標準はそのような使用法を具体的に禁止していますか? もしそうなら、最近のコンパイラは実際にその点で標準に準拠していますか?

0 投票する
16 に答える
167576 参照

c++ - 関数/メソッドのキーワード「インライン」はいつ書く必要がありますか?

関数/メソッドのキーワードinlineをC++でいつ書く必要がありますか?

いくつかの回答を見た後、いくつかの関連する質問:

  • C ++の関数/メソッドのキーワード「インライン」を記述すべきでないのはいつですか?

  • コンパイラはいつ関数/メソッドを「インライン」にするかわからないのですか?

  • 関数/メソッドの「インライン」を書き込むときに、アプリケーションがマルチスレッドであるかどうかは重要ですか?

0 投票する
4 に答える
640 参照

c++ - この C++ の削除の問題について説明していただけますか?

次のコードがあります。

WideString はサードパーティ クラスであり、StringUtils も同様です。彼らは私にとってブラックボックスです。2 番目のパラメーターは参照によって渡されます。

デバッガーをステップreturn ret実行すると、ヒープが破損している可能性があるという厄介なポップアップ (Visual C++) が表示されます。よく調べてみると、返された文字列のコピーは問題ありませんが、の削除はret失敗します。ret返す前に正しい値が含まれています。

これを引き起こすために、変換関数は何ができるでしょうか? 修正するアイデアはありますか?

アップデート:

  • プロジェクト自体はdllです
  • StringUtils はライブラリです
  • プロジェクトはマルチスレッド CRT に対してコンパイルされます (デバッグではなく、dll ではありません)。
  • Visual Studio の外部で実行すると、プログラムは正常に実行されるようです
0 投票する
5 に答える
435 参照

c++ - 純粋でない場合、仮想メンバー関数が使用されますか?

C++03 3.2.2 ...その名前が潜在的に評価される式に現れる場合、オブジェクトまたはオーバーロードされていない関数が使用されます。純粋でない場合は、仮想メンバー関数が使用されます...

すべてのプログラムに3.2.3、そのプログラムで使用されるすべての非インライン関数またはオブジェクトの定義が 1 つだけ含まれている必要があります。診断は必要ありません。定義は、プログラム内で明示的に表示されるか、標準またはユーザー定義ライブラリーで見つけることができます。または (適切な場合) 暗黙的に定義されます (12.1、12.4、および 12.8 を参照)。インライン関数は、それが使用されるすべての翻訳単位で定義されます。

私が読んでいる行に沿って:純粋な仮想関数は使用されていません。ODR は、使用される機能にのみ適用されます。これは、次のことが合法であることを意味しませんか? 答えはノーだと思いますが、そうではありませんが、その理由はわかりません。

0 投票する
1 に答える
1546 参照

c++ - hファイルの静的キーワードと内部リンケージ

さらに別のstatic質問。私は以下を読みました:

そして、私はまだ次の動作を理解できません:私は1つのhファイルを持っています:

そして2つのcppファイル:

と:

プログラムの出力は次のとおりです。

これで、ファイルが2回含まれてAいるため、コンストラクターが2回呼び出され、名前付きのインスタンスが宣言されているため、内部リンケージがあり、コンパイラーは満足しています。も静的に宣言されているため、内部リンケージもあり、その値は2つのファイルで共有されないことが予想されますが、プログラム出力は、2までカウントされるため、値が共有されることを意味します。hAastaticcountercpp

洞察はありますか?

h編集: vs 。ファイルで静的変数を宣言するという文脈で「良いプログラミング習慣」と見なされるものに関する回答cppも歓迎します。

0 投票する
3 に答える
265 参照

c++ - 1つの定義規則:対応するエンティティに異なる名前を付けることはできますか?

私はC++標準のODRに関連する条項を読んで読み直しましたが、この質問はまだ私に開かれています。この規格では、インライン関数の定義は、それが使用されるすべての変換単位に表示される必要があり、定義は、ほぼ1ページに記載されている意味で同一である必要があります。トークンシーケンスは同じでなければならないということです。ローカル識別子名が含まれていますか?

言い換えれば、次のプログラムはODRに違反していますか?(Visual Studio 2008で自分でテストしようとすると、エラーと警告が0になりました。しかし、例を2つの完全に異なる定義に変更しても、エラーと警告が0になるため、これは何も証明されないと思います。 MSVCの言い訳として、ODRの違反に対して正式に診断を行う必要はないことに注意してください。

0 投票する
3 に答える
42879 参照

c++ - ヘッダーファイルの静的変数

静的変数にはファイルスコープがあります。次の2つのファイルがあるとします。

  • file1.h
  • file1.cpp
  • file2.h
  • file2.cpp

static int Var1両方のヘッダーファイルで静的変数sayを宣言しました。file1.hとの両方file2.hがファイルに含まれていmain.cppます。

静的変数にはファイルスコープがあり、互いに競合しないため、これを行いました。しかし、コンパイル後、競合が発生していることがわかりました。

これで、静的変数は変数のように動作しexternます。一方、両方の.cppファイルで静的変数を宣言すると、正常にコンパイルされます。

私はこの振る舞いを理解することができません。

このシナリオでスコープとリンケージがどのように機能しているかを説明できる団体はありますか。

0 投票する
2 に答える
884 参照

c++ - .h ファイルが複数の cpp ファイルに含まれているクラスで積分静的 const を定義する

コンパイラは、b が複数回定義され、1 つが無視されるという警告を出します。配列を初期化する必要があるため、クラスで定義する必要があります。または、列挙型アプローチを使用してそれを行う必要があります。しかし、これが可能かどうか知りたかったのですか?

0 投票する
2 に答える
301 参照

c++ - 現在のC++0x標準ドラフトのこの段落を誰かが説明できますか?

ISON3242§3.2の2番目のポイントからこのステートメントを誰かが説明できますか

候補関数のセットのメンバーは、潜在的に評価された式から参照されたときにオーバーロード解決によって選択された場合にodr-usedに使用されます。[注:これには、名前付き関数の呼び出し(5.2.2)、演算子のオーバーロード(13節)、ユーザー定義の変換(12.3.2)、新しい配置の割り当て関数(5.3.4)、およびデフォルト以外の初期化が含まれます。 (8.5)。

ISO規格2003:言う

オーバーロードされた関数は、評価される可能性のある式から参照されたときにオーバーロード解決によって選択された場合に使用されます。[注:これには、名前付き関数の呼び出し(5.2.2)、演算子のオーバーロード(13節)、ユーザー定義の変換(12.3.2)、新しい配置の割り当て関数(5.3.4)、およびデフォルト以外の初期化が含まれます。 (8.5)。

これらのステートメントの実際の違いは何ですか?

誰かが例/プログラムの助けを借りてこれを説明できますか?