好的,我错过了什么....
我最初在IAR IDE /编译器上编写代码,以便在ARM微处理器上使用,并且工作正常。
我们现在使用Tricore微处理器切换到不同的控制器,现在使用带有GNU GCC编译器的code :: blocks IDE用于TriCore v3.4.6。
在构建时我得到了以下两个结构的错误(相关的枚举参考):
01| typedef enum equip_states_t {
02| stopped = 0,
03| starting = 1,
04| running = 2,
05| paused = 3,
06| stopping = 4
07| }equip_states_t;
08|
09| typedef enum info_level_t{
10| clear = 0,
11| alert = 1,
12| warning = 2,
13| error = 3
14| } info_level_t;
15|
16| typedef struct d2101_equip_states_t {
17| equip_states_t AIR_COMP_state:4; //Error starts here
18| pause_states_t auto_pause_state:4;
19| fullness_states_t BE_fullness:4;
20| equip_states_t BE_state:4;
21| fullness_states_t BIN_fullness:4;
22| bin_states_t BIN_state:4;
23| bin_states_t BYPASS_state:4;
24| control_modes_t control_mode:4;
25| equip_states_t DC_state:4;
26| source_dest_t DIV_auto_pause:4;
27| source_dest_t DIV_position:4;
28| equip_states_t HYDR_state:4;
29| equip_states_t QL_state:4;
30| fullness_states_t TC_fullness:4;
31| equip_states_t TC_state:4;
32| equip_states_t TUC_state:4;
33| } d2101_equip_states_t;
34|
35| typedef struct info_message_t {
36| uint16_t ID; //Error starts here
37| info_level_t status:8;
38| uint8_t not_used;
39| uint32_t time_stamp:32;
40| } info_message_t;
错误是:
[18] error: [11705] syntax error before "pause_states_t"
[18] warning: [11407] no semicolon at end of struct or union
[19] error: [11707] syntax error before ':' token
[20] error: [11707] syntax error before ':' token
[21] error: [11707] syntax error before ':' token
[24] error: [11707] syntax error before ':' token
[25] error: [11707] syntax error before ':' token
[26] error: [11707] syntax error before ':' token
[27] error: [11707] syntax error before ':' token
[28] error: [11707] syntax error before ':' token
[29] error: [11707] syntax error before ':' token
[30] error: [11707] syntax error before ':' token
[31] error: [11707] syntax error before ':' token
[32] error: [11707] syntax error before ':' token
[33] warning: [13263] type defaults to 'int' in declaration of 'd2101_equip_states_t'
[33] warning: [10516] data definition has no type or storage class
[37] error: [11705] syntax error before "info_level_t"
[37] warning: [11407] no semicolon at end of struct or union
[39] error: [11707] syntax error before ':' token
[40] warning: [13263] type defaults to 'int' in declaration of 'info_message_t'
[40] warning: [10516] data definition has no type or storage class
但是在许多其他实例中,包括在同一个文件中的一些前后,我使用相同的语法而没有错误,因此我对出错的地方感到困惑。例如。
typedef struct rmt2001_feedback_to_remote_t{
uint8_t screen_number;
bool fault_present:1;
switch_states_t DC:1;
switch_states_t air:1;
switch_states_t HYDR:1;
switch_states_t TUC:1;
switch_states_t BE:1;
switch_states_t TC:1;
switch_states_t green_backlight:1;
source_dest_t dest:3;
equip_states_t status:3;
switch_states_t red_backlight:1;
switch_states_t blue_backlight:1;
uint8_t gate_percent;
uint8_t bin_percent;
uint8_t BE_amps_msb;
uint8_t BE_amps_lsb;
uint8_t not_used;
} rmt2001_feedback_to_remote_t;
typedef struct IO_view_t{
master_or_slave_t master_or_slave:1;
uint8_t exponent:3;
uint8_t controller_id:4;
uint8_t io_id:6;
A_of_D_t A_or_D:1;
I_or_O_t I_or_O:1;
uint16_t raw;
int16_t value;
} IO_view_t;
如果我没记错的话,我在本网站的其他地方读到的内容是编译器之间的结构位打包不是很一致,因为它没有c标准明确/严格定义。我还读到使用带掩码和偏移的按位运算是一种更加跨平台友好的方式来进行位打包并且无法执行任何其他操作......但我想知道为什么这不仅仅适用于这两个实例而且我希望有一些简单的小东西可以帮助我避免这样做。
感谢大家的阅读时间。
答案是......它与两个编译器之间读取结构数据类型typedef的顺序和/或由于控制器的不同而对程序的轻微结构更改有关。
如果我将pause_states_t
和info_level_t
的typedef移动到在此文件之前肯定读取的另一个文件,则错误消失。
它似乎不是得到某种“无法识别的符号”或“无法识别的数据类型”错误,而是将其视为空白,这就是触发错误的原因。
这与我现在得到的一些其他错误一致,即编译器在读取typedef之前遇到客户数据类型。