在'['标记和+之前预期的非限定标识

时间:2017-03-13 08:43:02

标签: c++ struct arduino arduino-uno unions

我无法解决一个未知的问题,我从未体验过Arduino Nano(ATmega328)。我正在构建一个无人机源代码,它一直表现良好。但是,Arduino IDE中突然出现了错误 显然,我是编程方面的新手。所以帮助我找出如何解决这个问题。

我遇到这样的错误:

error: expected unqualified-id before '[' token 

error: 'value' does not name a type

 Quadcopter_Code_Arduino:580: error: expected unqualified-id 
 before '[' token

  struct op[]

           ^

Quadcopter_Code_Arduino:589: error: 'value' does not name a type

   } value;

     ^
typedef union accel_t_gyro_union
{
  struct
  {
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  } reg;
  struct op[]
  {
    int x_accel;
    int y_accel;
    int z_accel;
    int temperature;
    int x_gyro;
    int y_gyro;
    int z_gyro;
  } value;

};

3 个答案:

答案 0 :(得分:1)

struct op[] { ... }对我来说很奇怪。 (我甚至不知道如何阅读/解释这个。)

因此,我在cygwin上用gcc测试了这个(简化版):

$ gcc --version
gcc (GCC) 5.4.0

$ echo 'typedef union u { struct op[] { int i; } value; };
> int main() { return 0; } 
> ' > test-weird-union.c

$ gcc test-weird-union.c   
test-weird-union.c:1:28: error: expected identifier or '(' before '[' token
 typedef union u { struct op[] { int i; } value; };
                            ^
test-weird-union.c:1:42: error: expected ';' before 'value'
 typedef union u { struct op[] { int i; } value; };
                                          ^
test-weird-union.c:1:42: warning: useless storage class specifier in empty declaration

(与gcc -std=c11相同的输出。)

代码可能错误或至少不是标准C.

行。另外考虑一下:如何解决它?

多一点背景会很好。因此,将此视为一种方法并证明如何应用它:

#include <stdint.h>

typedef union accel_t_gyro_union
{
  struct
  {
    uint8_t x_accel_h;
    uint8_t x_accel_l;
    uint8_t y_accel_h;
    uint8_t y_accel_l;
    uint8_t z_accel_h;
    uint8_t z_accel_l;
    uint8_t t_h;
    uint8_t t_l;
    uint8_t x_gyro_h;
    uint8_t x_gyro_l;
    uint8_t y_gyro_h;
    uint8_t y_gyro_l;
    uint8_t z_gyro_h;
    uint8_t z_gyro_l;
  } reg;
  struct op
  {
    int16_t x_accel;
    int16_t y_accel;
    int16_t z_accel;
    int16_t temperature;
    int16_t x_gyro;
    int16_t y_gyro;
    int16_t z_gyro;
  } value;
} accel_t_gyro_union;

我做了以下事情:

  1. 删除[]后面的op以修复语法错误。

  2. int更改为int16_t。这可以确保此代码也适用于非16位平台。

  3. accel_t_gyro_union添加到typedef的末尾。这可能没有必要,但我觉得这很舒服。

  4. 再次使用gcc在cygwin上检查:

    $ gcc -std=c11 test-weird-union.c
    

    至少没有语法错误。其余的是我所不知道的。

答案 1 :(得分:1)

定义/信息:

来自http://en.cppreference.com/w/cpp/language/union

  

union是一种特殊的类类型,只能包含其中一个类型   一次非静态数据成员。

  

联盟只有拥有其最大数据成员所需的大小。   其他数据成员以相同的字节分配   最大的成员。

此外:

您的声明不正确,应该是:

struct op
{
    int x_accel;
    int y_accel;
    int z_accel;
    int temperature;
    int x_gyro;
    int y_gyro;
    int z_gyro;
} value [SIZE];

我建议你为你的数组使用一个特定的大小,或者你的结构类型的指针声明要清楚,你将在稍后决定它的堆大小,但是堆栈上的联合将有一个指针大小为会员......

(尽管有空括号,它仍然可以编译并在我的快速测试中起作用......我也应该读到这种行为。:D)

解决方案:

使用上面更正的声明。

建议: 在括号中使用SIZE作为数组。 如果您还不知道尺寸,请使用指针,原因如上所述。

答案 2 :(得分:1)

struct op[] { ... }无论如何都是废话。如果你想要名为struct的{​​{1}}类型,它应该在联合之外(但它不是真正的问题,在其他地方使用它可能有问题):

op

但根本不需要阵列。所以第二个struct A { uint8_t low_byte; // depends on byte order uint8_t high_byte; }; struct B { int word; }; union U { A reg; B val; } variable; 也应该是匿名的:

struct