下記のビットフィールドを宣言しました。C言語のビットフィールドをグローバルとして初期化できません
struct {
volatile uint8_t screenflag:1;
volatile uint8_t logoflag:1;
volatile uint8_t oledflag:1;
volatile uint8_t animationflag:1;
volatile uint8_t clockdialflag:1;
volatile uint8_t update_screen:1;
volatile uint8_t BLE_activity:1;
uint8_t ble_status:1;
} oled_flag;
しかし、私はmain()関数のうち、ビットフィールドの要素を初期化しようとしたときにコンパイルする際には、次のエラーを示しています。
....\Src\main.c(95): warning: #77-D: this declaration has no storage class or type specifier oled_flag.screenflag=1; ....\Src\main.c(95): error: #147: declaration is incompatible with "struct oled_flag" (declared at line 92)
oled_flag.screenflag=1; ....\Src\main.c(95): error: #65: expected a ";" oled_flag.screenflag=1; ....\Src\main.c(96): warning: #77-D: this declaration has no storage class or type specifier
oled_flag.logoflag=0; ....\Src\main.c(96): error: #147: declaration is incompatible with "struct oled_flag" (declared at line 95) oled_flag.logoflag=0; ....\Src\main.c(96): error: #65: expected a ";" oled_flag.logoflag=0; ....\Src\main.c(97): warning:77-D: this declaration has no storage class or type specifier oled_flag.oledflag=1; ....\Src\main.c(97): error: #147: declaration
is incompatible with "struct oled_flag" (declared at line 96) oled_flag.oledflag=1; ....\Src\main.c(97): error: #65: expected a ";" oled_flag.oledflag=1; ....\Src\main.c(98): warning:
77-D: this declaration has no storage class or type specifier oled_flag.animationflag=0; ....\Src\main.c(98): error: #147:
declaration is incompatible with "struct oled_flag" (declared at line 97) oled_flag.animationflag=0; ....\Src\main.c(98): error: #65: expected a ";"
oled_flag.animationflag=0; ....\Src\main.c(99): warning: #77-D: this declaration has no storage class or type specifier
oled_flag.clockdialflag=1; ....\Src\main.c(99): error: #147: declaration is incompatible with "struct oled_flag" (declared at line 98) oled_flag.clockdialflag=1; ....\Src\main.c(99): error: #65: expected a ";"
oled_flag.clockdialflag=1; ....\Src\main.c(100): warning: #77-D: this declaration has no storage class or type specifier
など。
初期化コードは次のとおりです。
oled_flag.screenflag=1;
oled_flag.logoflag=0;
oled_flag.oledflag=1;
oled_flag.animationflag=0;
oled_flag.clockdialflag=1;
oled_flag.update_screen=0;
oled_flag.BLE_activity=0;
oled_flag.ble_status=1;
しかし、私はmain()関数内のビットフィールドの要素を初期化するとき、それは正常に動作します。
'ビットを表すものではありませんメンバーをフィールドは任意のデータ型にすることができ、volatileまたはconst修飾子 ' – sjsam
を持つことができます。したがって、実際には 'oled_flag'とは何ですか? –
コメントをフォローアップする#1あなたのコンパイラがこれについて不平を言っていないのはなぜですか?それともそれを無視するほど賢いですか? – sjsam