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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- Excel(エクセル) Excelで行削除をすると… 1 2023/07/26 11:57
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python urlopen error について...
-
Ps+のフリープレイでDestiny2の...
-
Google ColaboでGUI作成
-
iCloudフォトライブラリ内の画...
-
本格的なGUIを作るのにおすすめ...
-
cでなぜguiアプリが作成出来る...
-
ATLとSTLの違いは何でしょうか?
-
declaration of 'index' shadow...
-
iPhoneのカメラロールへ画像を...
-
stricmp
-
標準ライブラリだけでgetch関数...
-
scipy っていうのをいれようと...
-
DOS上でTCP通信を行うプログラ...
-
設定ファイルを扱うライブラリ...
-
入出力ライブラリ
-
c言語でntpdateコマンドにあた...
-
色空間YCCKのJPEG画像
-
unix-c と linux-c の違いは?
-
ASP ODBC以外のSQLserver接続方法
-
sleep関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ps+のフリープレイでDestiny2の...
-
Windows Media Playerを開くと...
-
本格的なGUIを作るのにおすすめ...
-
python urlopen error について...
-
Google ColaboでGUI作成
-
scipy っていうのをいれようと...
-
システムコールと標準ライブラ...
-
ライブラリ作成時のグローバル...
-
強化学習の環境作成、AI。自動...
-
プログラマーで「使えない人」...
-
unix-c と linux-c の違いは?
-
C++ 標準ライブラリの実際の中...
-
マウスのクリックを自動で
-
C# EXCELセルの入力規則設定に...
-
LIBCMT.LIBをリンクしてコンパ...
-
gcc に mktemp 危険と怒られ...
-
Dreamweaverのライブラリが反映...
-
静的ライブラリから静的ライブ...
-
DLL読み込み時エラー
-
sleep関数
おすすめ情報