問題タブ [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で静的関数と変数を使用する理由
static
Cで、ファイル内の変数のスコープ制限としてキーワードを使用することについて疑問に思います。
私が見ているように、Cプログラムを構築する標準的な方法は次のとおりです。
- 関数と変数を定義するcファイルの束があり、スコープが。で制限されている可能性があります
static
。 - 他のcファイルが使用できるように、対応するcファイルの関数と場合によっては変数を宣言するhファイルの束があります。プライベート関数と変数はhファイルで公開されません。
- すべてのcファイルは個別にoファイルにコンパイルされます。
- すべてのoファイルはアプリケーションファイルにリンクされています。
static
とにかく変数がhファイルで公開されていない場合、gobalをとして宣言する2つの理由がわかります。
- 1つは読みやすさのためです。変数が他のファイルでアクセスされていないことを、私を含む将来の読者に知らせてください。
- 2つ目は、別のcファイルが変数を。として再宣言しないようにすることです
extern
。リンカは変数がとの両方extern
であることを嫌うと思いますstatic
。(ファイルが他の誰かが所有する変数を再宣言するという考えは嫌いですがextern
、それは大丈夫ですか?)
他の理由はありますか?
関数についても同じことが言えstatic
ます。プロトタイプがhファイルで公開されていない場合、他のファイルはとにかく関数を使用しない可能性があります。それでは、なぜそれを定義するstatic
のでしょうか。同じ2つの理由がわかりますが、それ以上はわかりません。
c++ - C++ で C# の「読み取り専用」動作を実現する
これはスタック オーバーフローに関する私の最初の質問なので、優しくしてください。
最初に、私が見たい正確な動作を説明しましょう。C# に精通している場合は、変数を「読み取り専用」として宣言すると、プログラマーがその変数に値を 1 回だけ割り当てることができることをご存知でしょう。変数をさらに変更しようとすると、エラーが発生します。
私が求めていること: 私が定義するすべてのシングルトン クラスを、プログラム内で 1 回だけ予測どおりにインスタンス化できるようにしたいと考えています (詳細は下部にあります)。
私の目標を実現するための私のアプローチは、 extern を使用してシングルトンへのグローバル参照を宣言することです (これは後で選択した時点でインスタンス化します。私が持っているものは、次のようになります。
ただし、これは実際には機能せず、ここからどこに行くべきかわかりません。
私が反対していることについての詳細:
いくつかのサードパーティ プロセスや作成する他のプロセスと通信しながら、ゲーム ロジックを処理するコードに取り組んでいるため、スレッド化について懸念しています。最終的には、何らかの同期を実装して、複数のスレッドが安心して Singleton クラスの情報にアクセスできるようにする必要があります。どのような種類の最適化を行いたいのか、またはスレッド化が正確に何を伴うのかわからないため (それを使用して実際のプロジェクトを実行したことはありません)、シングルトンがインスタンス化されるタイミングを予測可能に制御できることは良いことだと考えていました。
プロセス A がプロセス B を作成し、B には複数のファイルやライブラリに対して分散された複数のシングルトンが含まれているとします。これらのシングルトン オブジェクトがインスタンス化される順序を確実に保証できない場合、それは本当の悪夢になる可能性があります (それらは相互に依存する可能性があり、NULL オブジェクトでメソッドを呼び出すことは一般的に悪いことです)。
C# を使用している場合は readonly キーワードを使用するだけですが、この (コンパイラがサポートする) 動作を C++ で実装する方法はありますか? これも良い考えですか?フィードバックをお寄せいただきありがとうございます。
編集
上記のコード例に従うことに縛られていた場合、選択した回答は、必要なことを行う最も簡単な方法です。私はこれらの EntryPoint オブジェクトの 1 つだけを作成する予定ですが、シングルトンから離れたパターンに変更することにしました。
これらすべてのシングルトンが必要になると考えていた理由の 1 つは、モジュラー プラグイン タイプのアプリケーションをサポートするより大きなアーキテクチャを作成する計画があるためです。また、メモリ リークを最小限に抑えるために、より多くのエラー チェックとメモリ保護が必要でした。クロスプラットフォームの Qt ( http://qt.nokia.com/ ) が保護されたポインターやその他のクールな機能を提供していることを知り、うれしく思いました。
c++ - extern "C" DLL: デバッグは問題ありませんが、リリースするとエラー C2059 がスローされます
C++ Win32 アプリケーションとして作成した DLL があります。DLL での名前マングリングを防ぐために、以下に定義する EXPORT 定義を使用しました。
このコードをコンパイルするには、プロジェクトのプロパティに移動し、C/C++Calling Convention
を__stdcall (/Gz)に設定Compile As
し、Compile as C++ Code (/TP)に設定する必要がありました。
error C2059: syntax error: 'string'
これはデバッグ モードでは機能しましたが、リリース モードの設定をデバッグ設定と同じに構成したにもかかわらず、リリース モードではすべての EXPORT 関数がスローされます。
リリース モードをコンパイルするにはどうすればよいですか?
よろしく、
~Joe
(Visual Studio 2008 Professional で開発中)
編集:
私の #define に関する多くのコメントは、問題を引き起こしているようには見えません。
混乱を避けるために、私のヘッダー ファイルは次のように書き直されました。
それだけです。
エラー:
説明 error C2059: syntax error: 'string'
ファイル coilmodel.h
行 4
繰り返しますが、このエラーはリリース モードでのみ表示され、デバッグ モードでは表示されません。
プロジェクトは C++ Win32 DLL アプリケーションです。
c - Objective-C を使用したスタティック ライブラリの extern 変数
iPhone アプリにリンクする静的ライブラリを作成しました。このライブラリは、C のようにいくつかのグローバル変数と関数を使用します。私の問題は、たとえば次を使用する場合です。
この関数を使用したり、これらの変数にアクセスしたりすると、コード内の任意の場所で、コンパイラが教えてくれます
"_do_stuff" から参照: -[Object testMethod] in tests.o
"_a_variable" から参照: -[Object testMethod] in tests.o
"_an_array" から参照: -tests.o の [Object testMethod]
シンボルが見つかりません Collect2: Id が 1 つの終了ステータスを返しました
誰もこの問題に直面したことがありますか? 私は愚かなことをしていることを知っています.Objective-CまたはCの重要な概念がいくつか欠けていますが、実際には何がわかりません. だから私は誰かが私を助けてくれることを望んでいました。前もって感謝します。
c - リンク時間「未定義の参照」エラー
makefileを書くのに苦労しています。変数の使用経験がありextern
ます。makefileを使用せずにプロジェクトをビルドすると、エラーはまったく発生せず、プログラムを実行できます。しかし、プロジェクトをビルドするためにmakefileを作成したときから、undefined reference to
エラーが発生しています。
私は3つ以上のファイルを持っていますが、簡単にするために、ここでは3つのファイルを使用してセットアップを説明します。
makefileを使用するundefined reference to
と、File1.cとFile2.cを指すリンク時間中にエラーが発生しますか?
日食がそれ自体で修正する間違い(makefileが使用されていない場合)と、makefileを使用するときに表面化する間違いはありますか?
私の最終的なmakefileは次のようになります-
OBJ1=アルゴリズム/main.oアルゴリズム/File1.oアルゴリズム/File2.o
c - ライブラリとライブラリをインクルード/リンクする人に対して関数をグローバルにする方法はありますか?
私は今少し混乱しています。関数でexternを使用すると、すべてに対してグローバルになると思いましたが、そうではないようです...私が今欲しいのは、静的ライブラリで使用できる関数のセットをいくつか用意することです。それをリンクするプログラムで。どうすればいいですか?Objective-Cを使用しています
c++ - 構造体をグローバルまたは extern で宣言するとセグメンテーション違反が発生するのはなぜですか?
次のようにヘッダーで定義された構造体があります。
私は自分のコードで次のように使用します:
それはうまくいきます。ただし、LC_ERRMSG err;
グローバルに宣言した場合、つまり、使用されている関数の外で、またはextern LC_ERRMSG err;
(中央の場所でエラーステータスを読み取れるようにしたいので、これは私の当初の意図でした)、コードは snprintf 呼び出しでセグメンテーション違反を起こします。 .
理由を教えてください。
ddd は、グローバルに宣言されたときにメモリがすべてゼロに初期化されるか、extern が宣言されたときに少なくとも初期化されて読み取り可能であることを示しています。値 szFilename、szError、および LC_ERR_LEN はすべて正しく、意味があります。
iphone - iPhone、定数の存在を確認してください
実行時に定数が設定されているかどうかをどのように確認できますか?たとえば、iOS 4ではUIApplicationDidEnterBackgroundNotificationを使用できますが、iOS 3で実行している場合、使用しようとするとエラーが発生します。
compiler-construction - LLVM 外部関数
私は最近、MinGW で LLVM の実験を始めました。Kaleidoscopeのチュートリアルを読みましたが、外部関数に問題があります。
次のような外部関数を宣言しています。
mod は Module* で、ctx は LLVMContext& です。
この場合、すべてが正常に機能します。ただし、関数を宣言すると:
そして、SinFunction 宣言を "sin" の使用から "my_cubic_transform" の使用に (他には何も変更せずに) 変更すると、次のようになります。
「-g」オプションを含めるようにメイクファイルを変更しても効果はありません。Kaleidoscope のチュートリアルでは、これが LLVM で可能であることが示唆されました (少なくとも、私が使用している JIT では)。それで、私は何か間違ったことをしていますか?もしそうなら、何?