簡體   English   中英

實例化 typedef struct 類型時編譯錯誤(C 語言)

[英]Compile error with instantiation of typedef struct type (C language)

我對我遇到的問題感到困惑。 我正在用 Raspberry Pi 控制一堆繼電器,以方便打開和關閉繼電器,我為繼電器 gpio 引腳創建了一個結構定義。 下面是頭文件的完整內容:

#ifndef PIN_DEFINITIONS
#define PIN_DEFINITIONS

#define LTC2057_SHDN            2   // physical pin 3
#define K1_SET_SIGNAL           4   // physical pin 7
#define K7_SET_SIGNAL           5   // physical pin 29
#define RES_ARRAY_RESET_SIGNAL  6   // physical pin 31
#define K15_SET_SIGNAL          7   // physical pin 26
#define BANK_A_RESET_SIGNAL     8   // physical pin 24
#define K5_SET_SIGNAL           9   // physical pin 21
#define K4_SET_SIGNAL           10  // physical pin 19
#define K6_SET_SIGNAL           11  // physical pin 23
#define K14_SET_SIGNAL          12  // physical pin 32
#define K8_SET_SIGNAL           13  // physical pin 33
#define UART_TX                 14  // physical pin 8
#define UART_RX                 15  // physical pin 10
#define K13_SET_SIGNAL          16  // physical pin 36
#define K1_RESET_SIGNAL         17  // physical pin 11
#define CAL_RESET_SIGNAL        18  // physical pin 12
#define K9_SET_SIGNAL           19  // physical pin 35
#define K12_SET_SIGNAL          20  // physical pin 38
#define K11_SET_SIGNAL          21  // physical pin 40
#define K3_SET_SIGNAL           22  // physical pin 15
#define K17_SET_SIGNAL          23  // physical pin 16
#define K16_SET_SIGNAL          24  // physical pin 18
#define BANK_B_RESET_SIGNAL     25  // physical pin 22
#define K10_SET_SIGNAL          26  // physical pin 37
#define K2_SET_SIGNAL           27  // physical pin 13


typedef struct RELAY_STRUCTURE
{
    int bcm_set_pin;
    int bcm_reset_pin;
    int relay_number;
    int physical_set_pin;
    int physical_reset_pin;
} RELAY;

RELAY K1;
RELAY K2;
RELAY K3;
RELAY K4;
RELAY K5;
RELAY K6;
RELAY K7;
RELAY K8;
RELAY K9;
RELAY K10;
RELAY K11;
RELAY K12;
RELAY K13;
RELAY K14;
RELAY K15;

K1.bcm_set_pin = K1_SET_SIGNAL;
K1.bcm_reset_pin = K1_RESET_SIGNAL;
K1.relay_number = 1;
K1.physical_set_pin = 7;
K1.physical_reset_pin = 11;

K2.bcm_set_pin = K2_SET_SIGNAL;
K2.bcm_reset_pin = RES_ARRAY_RESET_SIGNAL;
K2.relay_number = 2;
K2.physical_set_pin = 13;
K2.physical_set_pin = 31;

K3.bcm_set_pin = K3_SET_SIGNAL;
K3.bcm_reset_pin = RES_ARRAY_RESET_SIGNAL;
K3.relay_number = 3;
K3.physical_set_pin = 15;
K3.physical_set_pin = 31;

K4.bcm_set_pin = K4_SET_SIGNAL;
K4.bcm_reset_pin = RES_ARRAY_RESET_SIGNAL;
K4.relay_number = 4;
K4.physical_set_pin = 19;
K4.physical_set_pin = 31;

K5.bcm_set_pin = K5_SET_SIGNAL;
K5.bcm_reset_pin = RES_ARRAY_RESET_SIGNAL;
K5.relay_number = 5;
K5.physical_set_pin = 9;
K5.physical_set_pin = 31;

#endif

問題出在頭文件“Pin_Defs.h”上。 如果我嘗試單獨編譯此文件,則會在嘗試為中繼結構的實例化賦值時出現編譯錯誤:

Pin_Defs.h:92:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 K1.bcm_set_pin = K1_SET_SIGNAL;
   ^
Pin_Defs.h:93:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 K1.bcm_reset_pin = K1_RESET_SIGNAL;
   ^
Pin_Defs.h:94:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 K1.relay_number = 1;
   ^
Pin_Defs.h:95:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 K1.physical_set_pin = 7;
   ^
Pin_Defs.h:96:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 K1.physical_reset_pin = 11;

如果引腳分配移動到不同的文件,比如 main.c,然后從 main.c 中 #include Pin_Defs.h,一切都編譯得很好。 我對問題是什么感到困惑。 我知道沒有缺少大括號或分號,因為唯一的區別是將實例化分配放在不同的文件中。 有人有任何見解嗎? 我通過放入一個單獨的文件來使其工作,我只是想更好地了解問題的根源。 非常感謝

您正在執行可執行語句,在這種情況下,表達式在函數之外執行賦值。 僅允許在函數外部使用帶有可選初始化程序的聲明和定義。

你想要做的是像這樣初始化變量:

RELAY K1 = { K1_SET_SIGNAL, K1_RESET_SIGNAL, 1, 7, 11 };

此外,將定義放在頭文件中也不是一個好主意。 如果多個源文件包含此標頭,您最終會遇到多個多重定義錯誤。 因此,您需要將extern聲明放在標題中,並將定義放在一個源文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM