プロが教えるわが家の防犯対策術!

static宣言を複数のソースファイルで共有したいと考え以下のようなプログラムになりました
やはりstaticの共有は無理でしょうか。

リソースファイルの記載内容
static HANDLE hInfoData;


関数と関数1は同じソースファイル

void関数(){
hInfoData = CreateFile(・・・)



void関数1(){
関数();
ここではhInfoDataが有効
}


別のソースファイル
リソースファイルをインクルード
void関数2(){
ここではhInfoDataがNULLになる
}

A 回答 (13件中1~10件)

「static宣言を複数のソースファイルで共有したい」がどういうことをしたいのかわからないのですが....



(関数の外で) static を付けて定義した変数はそのコンパイル単位 (ソースファイル) でしか見えないことはわかってますよね?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
staticはソース固有はわかっていますが、staticな変数を複数のソースで参照したいのです、staticを付けない変数はexternで複数のソースで参照できます、この場合変数の値がいつの間にか空白になるのです、この防止策を教えてください。

お礼日時:2018/05/21 08:41

リソースファイル?


ヘッダファイルじゃなくて?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>リソースファイル?
これは間違っていました、ヘッダーファイルです。
ヘッダーファイル名がリソース.hになっています。

お礼日時:2018/05/21 08:43

要するにhInfoDataがグローバル変数で、複数のソースファイルで同じ変数として利用できるようにしたい、ってことですよね?


普通にexternを使い、実体を1ファイルだけでグローバルセクションに「HANDLE hInfoData;」と宣言すればいいと思いますけど?

>staticを付けない変数はexternで複数のソースで参照できます、この場合変数の値がいつの間にか空白になるのです、この防止策を教えてください。

いつの間にか空白に「なる」のではなく、いつの間にか空白に「している」のではないでしょうか?
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます。
なぜ、変数のフォーカスがサラワレルのか不思議です、このためstaticで解決しています。

プログラムで立ち上げ時に一度だけ初期設定した後は、書き込みはせず読み出すだけなのにです、不思議です!!

お礼日時:2018/05/21 10:33

ファイルレベルのstaticは「共有しない」、つまり外部リンケージを作らず


コンパイル単位毎に別々にメモリを確保するぞ
という宣言なので、貴方のやりたいこととま逆です。

何故Cの作者が intern(internal) という修飾子にしなかったのか謎ですが・・・

何処かのソースでstaticをつけずに宣言。
他のソースからはexternで参照。

とするだけでグローバル変数を複数コンパイル単位で共有出来ます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
この一般的な変数が行方不明になることはよく経験することで、プログラムが思うようにに動作しない点を、まさかこの行方不明が影響しているとは知らず毎日を無駄にした経験があります。
staticを宣言することで一発で解決した苦い経験があり。
何でも、staticにすることが身についております。
一般的な変数が行方不明になることは、まさかコンパイラやビルダーが壊れているのでしょうか?

お礼日時:2018/05/21 14:12

No.3です。



>プログラムで立ち上げ時に一度だけ初期設定した後は、書き込みはせず読み出すだけなのにです、不思議です!!

仮に、どこかにこんな風に書いてあるとしたら、全然不思議じゃないです。

if (hInfoData = NULL) {
...
}

これは、No.3で回答した
>いつの間にか空白に「している」
にあたります。

そんな初歩的なミスなどしていない、ということでしたら、ごめんなさい、本当にわかりません。
    • good
    • 0
この回答へのお礼

たびたびの回答ありがとうございます。
ご指摘のような直接な変更は私の記憶ではないのですが、ソース行数が大きくなっている分、時間をかけて確認する必要はあるようです。
まさか、コンパイラが壊れた・・・とか?

お礼日時:2018/05/21 14:05

確認したいんですが, まさかヘッダファイルに


static HANDLE hInfoData;
と書いている, なんて馬鹿なことはしていませんよね?
    • good
    • 0
この回答へのお礼

早々からの回答、感謝します。

ハイ、私は素人なので・・・
resource.h
このファイルに
static HANDLE InfoData;
と書いてあります。

プログラムの一部では動作しているので、ためらわずに、ここに書いています。
まさかですが、いけない理由を教えて頂けませんか?

お礼日時:2018/05/21 14:51

No.5です。



>ご指摘のような直接な変更は私の記憶ではないのですが、

そりゃ、ないでしょう。
でも世の中には、
if (hInfoData == NULL) {
と書くつもりが
if (hInfoData = NULL) {
と書いてしまう人はいくらでもいます(恐らくほぼすべてのプログラマは経験しているでしょう)。

>ソース行数が大きくなっている分、時間をかけて確認する必要はあるようです。

この程度の話であれば、たとえソースファイルが100以上あろうとも、総コード行数が100万行あろうとも、ソースコードをテキスト検索すれば一発で分かります。

>まさか、コンパイラが壊れた・・・とか?

コードレビューするときに必ず言う言葉ですが、「プログラムは書いた通りにしか動かない」です。
プログラムに関しては、意図通りに動かない原因に外的要因はありませんので、まず外的要因を排除して調べてみてください。

なお、自分で作ったCPUで、そのCPUのために自前で作ったコンパイラにバグがあった、ということであればその限りではありません。
    • good
    • 0
この回答へのお礼

大変厳しいご意見ありがたくお受けいたします。
今後ともよろしくお願いいたします。
あっ、厳しくないか?

お礼日時:2018/05/21 15:06

source.c に


#include "header.h"
と書くと, これは
source.c の当該位置に header.h の内容を全部書く
のと基本的に同じ意味になります. つまり
static HANDLE hInfoData;
と書いてあるヘッダファイルを複数のソースで #include すると, それぞれのソースに
static HANDLE hInfoData;
と書いたのと同じ効果を発揮します.

そして, static な変数はその宣言のあるソースファイルの中でしか使えず, 複数のソースファイルで static と宣言するとそれぞれのソースファイルごとにその static な変数が作られます. もちろん, それらは「たまたま名前が同じ」であるだけで, 実体としては異なる変数となります.
    • good
    • 0
この回答へのお礼

それで、複数のソースに同名の変数名でstatic宣言してもエラーにならなかったのですね、但し、同名でも別物という訳ですか・・・
ヘッダーファイルに、スターティク宣言した変数を置くことはなんら問題ないことはわかりました、ただし、ご回答の意味は承知しておく必要はあるようです。
ありがとうございました。

お礼日時:2018/05/21 15:12

>ヘッダーファイルに、スターティク宣言した変数を置くことはなんら問題ないことはわかりました



メモリを無駄にしている。とか、
変更したつもりが別の変数だったので適用されていなかった。なじぇ?とかの問題に目をつぶれば…でしょうかね。

(不具合出た時に)面倒なんでそんな書き方しているプロジェクトメンバーが居たら、お説教ってところでしょうか。
# ルネサスマイコンで現在仕事していますが…RAMが64Kしかないのでやりくり必死ですわ。
# で、デバッガのウオッチでみられない。ということで、一時的にstatic変数にしている人は居ますけどね。
# 最適化でいろいろ変わるのでデバッグも結構大変…。
    • good
    • 0
この回答へのお礼

>変更したつもりが別の変数だったので適用されていなかった。なじぇ?とかの問題に目>をつぶれば…でしょうかね。
まさにこれが今回ぶち当たった原因かも知れません、いや全くこれが原因。
やはり、オーソドックスに書き上げるのが無難のようです。

それにしても、変数の内容が自然に変わるのは何故でしょう、変わらなければstaticは必要ないわけですが・・・
一般的な変数をstaticにしたとたん、バグが解決した事例も沢山あります。

お礼日時:2018/05/21 15:59

大丈夫かなぁ....



文法上ヘッダファイルに static な宣言を書くことに何らの問題もありません. ただ, static な宣言を含むヘッダを書かなければならない現実的な理由もほとんどないはずです. つまり,
ヘッダファイルには static な宣言を書かない
を原則とすべきです.
    • good
    • 0
この回答へのお礼

Tacosanありがとうございます、
やはり、混乱を招くようです、今回はソース行が膨大になっても複数ソースを1ファイルにする方向で検討します。
他のソースにはコマンドラインで解決します。
ありがとうございました。

お礼日時:2018/05/21 16:18

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