
C言語を用いてライブラリを作成しています。
ライブラリは機能ごとにファイルを分けています。
今、ライブラリの中でのみ使用するグローバル変数やグローバル関数が必要になりました。
このグローバル変数や関数は複数ファイルで参照するため、static宣言はできません。
しかし、このグローバル変数や関数は公開する必要はありません(ライブラリの中でのみ使用します)。
このようなことをC言語で実現するためにはどうしたらよいのでしょうか?
開発環境は
Windows7
VisualC++2010
です。
VisualC++2010を使うなら C++で書けばいいのではないかといわれそうですが、
C言語でプログラミングしたいのです。
以下のようなサイトがあったのですが、これを使うしかないでしょうか?
http://0xcc.net/blog/archives/000108.html
No.2ベストアンサー
- 回答日時:
スレッドセーフを意識する場合、ライブラリ内でグローバル変数を持つ事は許されません。
「一連の呼び出しの中で、グローバルなスコープが必要」なのであれば、fopen関数でやっているように「開始関数で一意のハンドラを返し、一意のハンドラを指定して一連の呼び出しを行ってもらい、終了処理で一意のハンドラを開放する」と言うような書き方をしないといけません。
fopenが「グローバル変数で、次に使える、空いているハンドラの番号を持っている」と言う実装があったとします。
もし、メインのスレッドでfopenが3番のハンドラを返そうと準備している真っ最中(fopenから、まだ帰って来てない状態)に、サブのスレッドがfopenを呼び出して3番のハンドラを受け取ったら、どうなると思いますか?
メインのスレッドも、サブのスレッドも、どっちも「3番のハンドラ」を受け取ります。
メインとサブで異なるファイルをオープンしているのに、ライブラリがグローバル変数で「次の空きは3番」なんて情報を持っていた所為で、両方とも「3番」を受け取ってしまったのです。
もちろん、実際のfopenは「マルチスレッドであっても一意」になっているヒープ領域を用いて「スレッドが切り替わっても大丈夫」な作り(つまり、スレッドセーフ)になっているので、こういう事は起きません。
ライブラリ内にグローバル変数を作ると「マルチスレッド禁止」になっちゃうので、スレッドセーフにするなら、グローバル変数は作ってはいけません。ライブラリ内の変数は、必ず「外にスコープを持たないstatic変数」にしないといけません。
スレッドセーフについては完全に考えから抜けていました。
やはり、グローバル変数は作らないようにします。
ありがとうございました。
No.3
- 回答日時:
>ライブラリ使用者がライブラリ内でしか使用しないグローバル関数やグローバル変数と同じ名前を使用しても問題ないレベルを希望しています。
C言語ではそれは不可能。言語の仕様上、そういう事は「出来ない仕様」になっています。
例えば、fopenを使うと、fopen等のファイル入出力関数群がグローバルに扱う「_iobuf」と言う変数がリンクされます。
当然、ユーザーは「_iobuf」と言う名前のグローバル変数を作る事は許されません。「同じ名前は許されない」からです。
そのため、Cの標準ライブラリでは、グローバル変数やシンボリック定数は「アンダースコアから始まる」と決められ「ユーザーはアンダースコアから始まる変数や定数を作ってはならない」と決めました。
とうぜん、そうした理由は「ライブラリ内でしか使用しないグローバル関数やグローバル変数と同じ名前は、ユーザーは使用出来なくなる」からです。
なので、最初から「ユーザーは使うな」と決めたのです。
「使うな」と禁止しておけば、バッティングする事は有り得ません。
早速のご回答ありがとうございます。
おっしゃっている意味はわかるのですが、
VC++2010のオプションなどで救える手段があれば教えていただきたいのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
【C言語】全角文字の配列を、全...
-
プログラマー達は何故、プログ...
-
C# で 数式文字列処理を処理す...
-
C言語 関数、変数の宣言について
-
プログラミングc++を全く分か...
-
逆コンパイルと逆アセンブルの...
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
C言語について(初心者)
-
プログラマーです。このDB設計...
-
C#でログファイルにファイルパ...
-
c言語
-
いまc言語の標準ライブラリ文字...
-
ペーパーマリオみたいにドット...
-
プログラミング 2つの整数を読...
-
visual studio 2022でのC#プロ...
-
PIC12F1822でLED調光器を作りたい
-
最初に聞かれたこと
-
あってる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows Media Playerを開くと...
-
iCloudフォトライブラリ内の画...
-
Google ColaboでGUI作成
-
Ps+のフリープレイでDestiny2の...
-
python urlopen error について...
-
本格的なGUIを作るのにおすすめ...
-
C言語について。
-
マウスのクリックを自動で
-
設定ファイルを扱うライブラリ...
-
declaration of 'index' shadow...
-
unix-c と linux-c の違いは?
-
C++ 標準ライブラリの実際の中...
-
boostのアンインストールについて
-
【VBA】イベントログの取得
-
ISOイメージの作成方法について
-
Dreamweaverのライブラリが反映...
-
ライブラリ作成時のグローバル...
-
LIBCMT.LIBをリンクしてコンパ...
-
暗号化ライブラリを探しています
-
outp関数について
おすすめ情報