2

MindTree Bluetooth SDK を使用する組み込みアプリケーションを開発しています。

ヘッダーファイルに次のものがあります。

typedef struct {
    UCHAR outputDir;
    UCHAR reset;
    UCHAR nack;
    UCHAR startCondition;
    UCHAR stopCondition;
    UCHAR busy;
} USCI_ConfigurationFlags;

static USCI_ConfigurationFlags usciConfigFlags = { UCTR, UCSWRST, UCNACKIFG, UCTXSTT, UCTXSTP, UCBBUSY };

後で 2 つの .c ファイルに上記のヘッダーを含め、さまざまな機会に割り込み内からusciConfigFlagsを使用します。

これは合法ですか?

SDKでBT_bluetooth_onメソッドを呼び出した後、実行時に構造体の値が変更される理由(および質問に関連している場合)を理解しようとしています。

ありがとう、アダム。

4

3 に答える 3

8

staticここはあなたがそれが何を意味すると思うかを意味するものではありません。これは、宣言と変数が1つのコンパイル単位でのみ表示されることを意味します。つまり、の2つの独立したインスタンスがありusciConfigFlagsます。

グローバル変数が必要な場合は、externnotを使用し、cファイルの1つで初期値を使用staticして実際の宣言(なし)を行う必要があります。extern

また、適切にロックせずに構造体の値を変更することにうんざりしてください。通常、読み取り専用の同時アクセスで問題ありません。

于 2012-09-24T01:31:57.530 に答える
1

ヘッダーを 2 つのファイルに含めても問題ありません.c。修飾子は、ヘッダーのみを含むファイル内の変数のstaticアクセス可能なスコープを制限します。2usciConfigFlagsつの異なるファイルの 2 つは同一ではありません。

またstatic、一定という意味ではありません。したがって、構造体の値を好きなように変更できます。

以下ウィキペディアより

コンピューター プログラミングでは、静的変数は静的に割り当てられた変数であり、その有効期間はプログラムの実行全体に及びます。これは、記憶域がコール スタックで割り当てられ、割り当て解除される、より一時的な自動変数 (ローカル変数) とは対照的です。ストレージが動的に割り当てられるオブジェクトとは対照的です。

于 2012-09-24T01:34:29.200 に答える
1

変数の先頭に static キーワードを追加すると、現在の翻訳単位でのみ可視になります (つまり、関数内の場合はその関数のみ、ファイル内の場合はそのファイルのみ)。

ヘッダー ファイルで変数を定義することは決して良い考えではありません。同じ名前の 2 つの異なるファイルに 2 つの静的変数が必要な場合でも、.c ファイル自体を配置することをお勧めします。使用されています。

ヘッダー ファイルに追加すると、後で、他の .c ファイルにこのヘッダーが含まれている場合、この変数がその翻訳単位に不必要に含まれます。

エプサロンは、あなたが考慮できる他の良い点を提案しました。

于 2012-09-24T01:38:43.780 に答える