アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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


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

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



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


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

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

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

>この一般的な変数が行方不明になることはよく経験することで



意味不明なんですが(^-^;

自分で作りこんでしまったバグが把握できて無いだけと思いますが、
staticの意味を知らないということは自分がまだCの初心者だという
ことを自覚するべきです。

cをよく知っている人にソースをみて貰った方が良いですよ。
    • good
    • 0
この回答へのお礼

回答感謝します、特殊な作業ですので近辺に相談する人がいないので困っています。

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

>それにしても、変数の内容が自然に変わるのは何故でしょう、変わらなければstaticは必要ないわけですが・・・


>一般的な変数をstaticにしたとたん、バグが解決した事例も沢山あります。

まぁ、既にツッコミありますけど…現象確認できるコードを掲示してください。

可能性としては……
・ローカル変数(いわゆるauto変数)に値を設定、次にコールされた時に値が壊れているのはなじぇ?
 (未初期化のローカル変数はそういうものです。)
・グローバル変数で値設定しているのにいつの間にか値変わっているのはなじぇ?
 (おそらくバグでどこかから書き換えを行っています。ポインタや配列使っているならその辺り注意しましょう。)

>やはり、混乱を招くようです、今回はソース行が膨大になっても複数ソースを1ファイルにする方向で検討します。

たぶん、後で混乱するからやめておいた方がいいんですけどねぇ。
機能ごとなどでファイルは分割しておかないと見通し悪くなりますよ。
# で、グローバル変数が妙なところ(関数定義と関数定義の間とか)に書かれていて、見失うとか。
    • good
    • 0
この回答へのお礼

コードの提示したいですが、体系だてて取り上げる箇所が見当たらないので、ごめんなさい。
変数飛ぶのが怖いので、ソース一本化してstaticで頑張ります。
ありがとうございました。

お礼日時:2018/05/21 20:37

「変数の内容が自然に変わる」というのはどういうことでしょうか? 例えば放射線の影響でメモリの内容が変わるなどの事例は知られていますが, 通常そのようなケースは除外して考えるので変数の値は「プログラムで変えない限り変わらない」とみなすはずです.



「変数の内容が自然に変わる」ような, 具体的かつ簡単なプログラムはありませんか?
    • good
    • 0
この回答へのお礼

申し訳ありませんが、何処から何処までが関係しているか判らないのです、提示する箇所が特定できないため、一般的なことしかお伝えできません。
何度も回答いただきありがとうございました。

お礼日時:2018/05/21 20:37

大丈夫かなぁ....



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

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

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

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



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

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

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

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

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

No.5です。



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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

No.3です。



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

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

if (hInfoData = NULL) {
...
}

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

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

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

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

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


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

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

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

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

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

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

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