教えて!gooにおける不適切な投稿への対応について

C言語を用いてライブラリを作成しています。
ライブラリは機能ごとにファイルを分けています。
今、ライブラリの中でのみ使用するグローバル変数やグローバル関数が必要になりました。
このグローバル変数や関数は複数ファイルで参照するため、static宣言はできません。

しかし、このグローバル変数や関数は公開する必要はありません(ライブラリの中でのみ使用します)。


このようなことをC言語で実現するためにはどうしたらよいのでしょうか?

開発環境は
Windows7
VisualC++2010
です。

VisualC++2010を使うなら C++で書けばいいのではないかといわれそうですが、
C言語でプログラミングしたいのです。

以下のようなサイトがあったのですが、これを使うしかないでしょうか?
http://0xcc.net/blog/archives/000108.html

gooドクター

A 回答 (3件)

スレッドセーフを意識する場合、ライブラリ内でグローバル変数を持つ事は許されません。



「一連の呼び出しの中で、グローバルなスコープが必要」なのであれば、fopen関数でやっているように「開始関数で一意のハンドラを返し、一意のハンドラを指定して一連の呼び出しを行ってもらい、終了処理で一意のハンドラを開放する」と言うような書き方をしないといけません。

fopenが「グローバル変数で、次に使える、空いているハンドラの番号を持っている」と言う実装があったとします。

もし、メインのスレッドでfopenが3番のハンドラを返そうと準備している真っ最中(fopenから、まだ帰って来てない状態)に、サブのスレッドがfopenを呼び出して3番のハンドラを受け取ったら、どうなると思いますか?

メインのスレッドも、サブのスレッドも、どっちも「3番のハンドラ」を受け取ります。

メインとサブで異なるファイルをオープンしているのに、ライブラリがグローバル変数で「次の空きは3番」なんて情報を持っていた所為で、両方とも「3番」を受け取ってしまったのです。

もちろん、実際のfopenは「マルチスレッドであっても一意」になっているヒープ領域を用いて「スレッドが切り替わっても大丈夫」な作り(つまり、スレッドセーフ)になっているので、こういう事は起きません。

ライブラリ内にグローバル変数を作ると「マルチスレッド禁止」になっちゃうので、スレッドセーフにするなら、グローバル変数は作ってはいけません。ライブラリ内の変数は、必ず「外にスコープを持たないstatic変数」にしないといけません。
    • good
    • 0
この回答へのお礼

スレッドセーフについては完全に考えから抜けていました。
やはり、グローバル変数は作らないようにします。
ありがとうございました。

お礼日時:2014/11/04 19:16

>ライブラリ使用者がライブラリ内でしか使用しないグローバル関数やグローバル変数と同じ名前を使用しても問題ないレベルを希望しています。



C言語ではそれは不可能。言語の仕様上、そういう事は「出来ない仕様」になっています。

例えば、fopenを使うと、fopen等のファイル入出力関数群がグローバルに扱う「_iobuf」と言う変数がリンクされます。

当然、ユーザーは「_iobuf」と言う名前のグローバル変数を作る事は許されません。「同じ名前は許されない」からです。

そのため、Cの標準ライブラリでは、グローバル変数やシンボリック定数は「アンダースコアから始まる」と決められ「ユーザーはアンダースコアから始まる変数や定数を作ってはならない」と決めました。

とうぜん、そうした理由は「ライブラリ内でしか使用しないグローバル関数やグローバル変数と同じ名前は、ユーザーは使用出来なくなる」からです。

なので、最初から「ユーザーは使うな」と決めたのです。

「使うな」と禁止しておけば、バッティングする事は有り得ません。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
おっしゃっている意味はわかるのですが、
VC++2010のオプションなどで救える手段があれば教えていただきたいのですが。

お礼日時:2014/11/04 19:19

「ある程度」で妥協していいなら「外部から #include するヘッダ」と「内部からのみ #include するヘッダ」に分けるの

が簡単.
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
公開しないということなら、ヘッダを分けることでもある程度は実現できますが、
ライブラリ使用者がライブラリ内でしか使用しないグローバル関数やグローバル変数と同じ名前を使用しても問題ないレベルを希望しています。

お礼日時:2014/11/04 17:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

人気Q&Aランキング