問題タブ [linkage]
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++ - 外部リンケージを持つコンパイラの異なる動作
VC++ 10 で次のソースをコンパイルするi
と、静的リンケージが割り当てられますが42
、G++ 4.5.1 ではi
、source2.cpp の外部リンケージが割り当てられ42
ます。
基準に従った標準確認動作とは何か、またはその理由についてのアイデアはありますか?
c - Cでの静的変数の宣言/初期化を理解する
プロジェクトにはtest.cというファイルが1つだけあります。「TRUE」を定義しないと、以下のコードはコンパイルされません。私はvcを使用します。動作を理解したいだけです。この点に光を当ててください。
string - レコードのリンケージ: 文字列コンパレータの比較
私はレコード リンケージ プロジェクトに取り組んでおり、さまざまな文字列コンパレータについて調査作業を行う必要があります。私が見ているものは次のとおりです。
ジャロ・ウィンクラー、レーベンシュタイン距離、最長共通部分文字列、完全一致。
私は疑問に思っていますが、どれがいつ使用するのに適しているかを判断するために何か作業が行われましたか? つまり、Jaro-Winkler は名前には適しているように見えますが、社会保障番号を完全に一致させる方がよい場合があります。アドレスにはどれを使用しますか? Jaro-Winkler には他の製品より優れている点はありますか?
誰かが私に指摘できるホワイトペーパーはありますか?
ありがとう。
c++ - 関数をインライン化すると、そのリンケージに影響しますか?
関数をインライン化すると、リンケージが内部リンケージに変更されますか? 例: 2 つのファイルでインライン関数を使用または呼び出しています。
インライン関数を呼び出すために、各ファイルでインライン関数を定義する必要があるのはなぜですか? 内部リンケージを取得していますか?を使用するとどうなりますstatic inline
か?
c++ - Rob Hess の SIFT ライブラリ (C で、OpenCV を使用) を C++ とリンクする
C++ プロジェクトでRob Hess の SIFT ライブラリを使用しようとしています。他の SIFT 実装 (のコード) も調べましたが、これは元の Lowe の論文のように最も段階的に分割されていて、私が慣れ親しんでいる OpenCV も使用しているように見えたので、これを選択しました。
残念ながら、C++ で使用して以来、問題が発生しただけです。ライブラリは、もともと OpenCV を使用して C で記述されています。
C ライブラリの include-s を で囲む場合としない場合の両方でコードをコンパイルしようとしましextern
たが、どちらも機能しません。どちらの場合も問題が何であるかを診断したと思いますが、それらを解決する方法がわかりません。助けていただければ幸いです。
問題(または少なくとも、私が問題だと思うもの):
withouth
extern
: C++ の名前マングリングが原因で動作しません (私はチェックしましたが、もちろんすべての関数名は装飾されています)with
extern
: OpenCV は C または C++ 用にコンパイルされた天気を検出できるため、機能しません。SIFT ライブラリ関数のいずれにもリンケージの問題はありませんが、現在 OpenCV には C++ ヘッダーが含まれており、メイン プログラムでは最終的にextern
ブロックに含まれているため、次のような (文字通り何百もの) エラーが発生します。/usr/local/include/opencv2/core/mat.hpp:2361: error: template with C linkage
私はこの数日間、これを機能させようとしてきたので、誰かが C++ で同じ SIFT ライブラリを使用しようとした場合、または別のライブラリで同様の問題を経験したことがある場合は、助けていただければ幸いです。
c++ - C リンケージと c++ ヘッダー
C リンケージを持つ共有ライブラリでいくつかの C++ クラスを使用したいと考えています。そして、私は次の問題を抱えています。
もしも
コンパイルとリンクは成功しましたが、結果のライブラリに f() が見つかりませんでした。
もしも
iostream およびインクルード ヘッダーで C++ キーワード「テンプレート」が発生するたびに、多くのコンパイラ エラーが発生しました (英語で正しく翻訳する方法がわからない、C リンケージを使用したテンプレートについて何か)。
何をすべきですか?
c++ - extern "C" 関数を介した C++ オブジェクトへのインターフェイス
extern "C"
関数は、C++ 固有のデータ型 (参照、メンバーへのポインター、または非 POD クラス (値渡し) など) を受け入れたり返したりできますか? これを禁止するC++標準には何も見つかりません。論理的には、C ABI がそのような型を渡すのに必ずしも適しているとは限らないため、標準がそれについて何かを言うことを期待しています。
私が C リンケージを使用したい理由は、C コンパイラとは関係ありません。この関数は、C++ コードからのみ呼び出されます。動的ライブラリからマングルされていない関数名をエクスポートしたいだけです。
愚かなコード例:
これは Linux 上の GCC でコンパイルされ、期待どおりに動作します。それは、標準的にすべきですか?
この質問は、この質問へのコメントでの議論のフォローアップです。
更新これを Comeau コンパイラでテストしましたが、問題はありませんでした。
c++ - 名前空間内に C++ クラスの dll をインポートするにはどうすればよいですか
C と互換性のある関数の簡単な例を示すドキュメントをいくつか読みました。
私はそれで大丈夫です。この dll の機能を使用する小さなアプリケーションを作成します。明示的なリンクを使用しました
関数。C スタイルの関数は問題なく動作します。しかし、クラスを次のように書くと
それはうまくコンパイルされ、DLLが作成されます。C スタイルの関数を使用している間、私は単に LoadLibrary() および GetProcAddress(...) 関数から関数ポインタを取得していました。
私の以前の使い方は
しかし、クラスをインスタンス化する方法がわかりません。明示的リンケージまたは暗黙的リンケージを使用するにはどうすればよいですか?
コードサンプルの助けをいただければ幸いです。
c++ - インライン関数にデフォルトで外部リンケージがあるのはなぜですか?
規格は、
これfoo
は、外部リンケージを持つインライン関数です(デフォルトでは、すべての関数宣言に外部リンケージがあるため)。これは奇妙なことに私を襲います。1つの定義ルールセクション3.2(C++03とC++11の両方)は次のように述べているためです。
3 ...インライン関数は、それが使用されるすべての変換単位で定義されるものとします。
5 a[n]の定義は複数存在する可能性があります...外部リンケージを使用したインライン関数(7.1.2)...複数の変換単位で定義されたDという名前のエンティティが与えられた場合...Dの各定義はトークンの同じシーケンスで構成されます
これは、インライン関数にも内部リンケージがある可能性があることを意味します。これは、外部リンケージを介して(つまり、変換ユニット間で)関数を使用すると、未定義の動作(段落3による)が呼び出され、その内容がすべての変換ユニットのインライン関数は同じである必要があります。
このルールには、下位互換性または特定のツールチェーンの理由がありますか?