問題タブ [extern]
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++ - さまざまな定数/静的変数のリンク
次の変数からのリンケージについていくつか質問があります。C++03の7.1.1/7の例とコンパイラー(Comeau、Clang、GCC)の実験により、次の種類のリンケージにたどり着きました。
最初
static
に、次にextern
セクション3.5によると、私には明らかです。(a)内部リンクを意味します。また、(b)は、名前「a」が静的であると宣言されているため((a)によって)、内部リンケージも意味します。
最初
extern
に、次にstatic
まず、(c)は外部リンケージを意味します。ただし、(d)は、名前「b」が(d)によって静的であると宣言されているため、内部リンクを意味します。暗黙のリンケージが一貫していないため、7.1.1/7によるとこれは無効です。
最初
const
に、次にextern
まず、(e)は内部リンケージを意味します。これは、constであり、明示的な外部リンケージを宣言しておらず、以前は外部リンケージを暗示していなかったためです。また、(f)externリンケージを意味し、エラーになるはずです。これは、externという名前を明示的に宣言しているためですが、コンパイラーはそれを内部に保持します。なぜそうなのか? それが私の質問です。
最初
extern
に、次にconst
ここで、(g)は、externを明示的に宣言したため、外部リンケージを意味します。また、(h)は、(g)externを明示的に宣言しているため、外部リンケージも意味します。
次のテンプレートを使用して、3と4のリンケージを実験的に見つけました(2番目の引数は外部リンケージが必要です)
要約:チャールズベイリーとの話し合いは非常に実り多いものであることが判明し3.5/3
、重要な箇条書きが
名前空間スコープ(3.3.5)を持つ名前は、
- constとして明示的に宣言されており、externとして明示的に宣言されておらず、外部リンケージを持つように以前に宣言されていないオブジェクトまたは参照。
ポイントを見ると(f)
、以下に示すように、2つの解釈は異なる結論に達します。
宣言されているが、
pi1
宣言されている最初の解釈ノート。したがって、変数には外部リンケージがあります。const
extern
2番目の解釈は、「宣言された」の両方の出現を解釈して、同じ宣言を参照します。このように、それは宣言されているが、では
const
ないextern const
ことを意味します。(e)
は宣言されており、宣言されconst
ていないことに注意してください。extern const
したがって、pi1
内部リンクを提供します。
さて、どのような解釈が正しいのでしょうか?その言葉遣いからは判断できませんが、コンパイラーはこれを2番目の方法で解釈しているようです。特に、最初の解釈を行う場合、名前が宣言され、以前に外部リンケージを使用して明示的に宣言3.5/3
されていない有効なシナリオがないため、の最後に引用された部分は不要になります。const
extern
c++ - C++のグローバル変数
多くのクラスを持つC++マルチスレッドアプリケーションで、グローバル変数を定義するメソッドを見つけようとしています
Cスタイル、任意の1つのソースファイルでグローバルとして定義し、この変数にアクセスするクラスに含まれるヘッダーでexternとして定義します。
これらのグローバル変数を含み、変数に書き込むためのset/getメソッドを公開するシングルトンクラスを記述します。
2番目の方法では、最初のアプローチではなく、集中管理された方法でロックを介してマルチスレッドアクセスを制御できます。
より多くのより良い方法がありますか?
c - 名前でextern変数(または関数)を取得する方法はありますか
名前が const char * として渡された任意の extern 変数へのポインタを返すことができる C 標準ライブラリ関数について最近読んだ気がします。それが助けになるなら、リンカーシンボルを介して機能すると思います。
c++ - デバッグ クラス、C++、リンカ エラー
私が取り組んでいるプロジェクトのデバッグ クラスを作成しようとしていますが、デバッグ オブジェクトを渡す必要がないので、このようにしようとしていました。ただし、コンパイラまたはリンカが、作成中の実装をスキップしているように見える理由がわかりません。
#include "Debug.cpp" を main.cpp に追加すると、このコードは問題なく動作します。実装を .h ファイルに入れるか、Debug.cpp を #include しない限り、コンパイラは何らかの理由で open、close、および print 関数の実装を欠いています。
Debug.cpp に実装が表示されない理由がわかりましたか?
関係ないと思いますが、現在、debug.h と debug.cpp は 1 つのプロジェクトにあり、main.cpp は別のプロジェクトにあります (両方とも同じソリューション内ですが、Visual Studio 2008)。main.cpp は実行可能ファイルとしてビルドされ、debug.h と debug.cpp はダイナミック ライブラリ (dll) としてコンパイルされます。
Debug.h
コード: すべて選択
Debug.cpp
コード: すべて選択
main.cpp
コード: すべて選択
メイン関数の印刷行のコメントを外すと、次のエラーが発生します。
コード: すべて選択
編集:私の元の議論へのリンク:
http://elysianshadows.com/phpBB3/viewtopic.php?f=6&t=5328&start=999999
iphone - ビューコントローラーでアクセスできるように外部整数変数を宣言する方法
すべてのビューで変数にアクセスしたいので、どうすれば宣言できますか....
c++ - C ++Extern/複数の定義
externを使用してC++でAdaにインターフェイスしようとしています。これら2つの実装の違いは何ですか?
実装A
実装B
どちらの実装も問題なくコンパイルされます。しかし、Impl-Aはリンクに失敗し、インデックスと値の複数定義エラーが発生します。私は違いを理解しようとしているだけです。
c++ - externを使用する場合の未定義の参照
私は次の設定をしています(うまくいけば、これはあまりにも裸の例ではありません):
ああ
A.cpp
Bh
B.cpp
さて、instを使用するB.cpp
とundefined reference to inst
。
これを修正する方法について何かアイデアはありますか?
c++ - .CPPファイルから変数にアクセスするC++
.cppファイル間の変数アクセスがどのように機能するかについて少しあいまいです。例えば:
main.cpp
main2.cpp
これにより、main.cppでコンパイラエラーが生成され、iに存在しないことが通知されます。では、「static」キーワードはこのコンテキストでどのような違いがありますか?(私はそれのためにグーグルを試しましたが、ほとんどの「静的キーワード」情報ページはクラスと関数について話します)
main2.cpp
同じですか?extern int i
他の場所へのアクセスに使用されるのを防ぎますi
か?匿名の名前空間の使用は、変数の処理方法がどのように異なりますか?
main2.cpp
総括する:
- .cppファイル間で変数にアクセスできますか?(externキーワードは別として)
- グローバル変数のstaticキーワードはどのように影響しますか?
- 匿名の名前空間はどのように物事に異なる影響を与えますか?
c++ - C++ の「extern "C"」ブロックで c99 を使用する
C で記述された関数が必要ですが、C++ から呼び出し可能で、制限されたポインターを使用します。extern "C"
これは c99 でのみ利用可能であるため、g++ は、ブロックであってもそれを好まない。この制限を回避するにはどうすればよいですか?
c++ - extern "C"(Cリンケージ)デフォルト
質問
GCC、MSVC、Clang、またはいくつかの組み合わせは、リンケージをデフォルトのCに設定することをサポートしていますか?
バックグラウンド
私は大規模な混合C/C ++プロジェクトを持っており、Cリンケージを使用してC ++ソースでシンボルをエクスポートするのは簡単で論理的ですが、これらの同じソースは、プロジェクトの残りの部分がC++リンケージの下にあると想定しています。
現在の状況では、C ++ソースで定義されているCソースが使用するものすべてと、C++ソースがCソースから使用するすべてのものを明示的にラップする必要がありますextern "C++"
。
extern "C"
最後に、実際のC ++のものが文句を言うので、ソースファイルまたはヘッダーファイル全体を配置することはできません。#include <memory>
(私が定義したfromやテンプレートなど。)