错误:未正确定义Struct

时间:2013-02-28 01:55:28

标签: c struct c-preprocessor gpio

我正在使用beaglebone做一些GPIO,目前在我的代码中有这个:

#include <linux/gpio.h>         //for GPIO

char label[] = "sys/kernel/debug/gpio";

struct gpio xx[] = {
    { gpio1, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio2, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio3, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio4, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio5, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio6, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio7, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio8, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio9, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio10, GPIOF_DIR_OUT|GPIOF_INIT_HIGH, label },
    };

其中gpio#,都被定义为整数。 GPIOF_DIR_OUT和GPIOF_DIR_LOW是“linux / gpio.h”中的函数。

结构未在函数内声明。我相信这是我的问题,但我不确定它是如何被宣布错误的。我已经看到了其他线程,但没有真正帮助解决我的问题。我认为问题是我在我的struct中调用一个函数。如果有人可以验证,或者帮我解决这个问题,那就太好了。

4 个答案:

答案 0 :(得分:1)

如果gpio1gpio10是整数,正如你所说,那么你在这里声明的是,正如编译器所说,它是无效的。 C中的全局变量初始值设定项必须是常量表达式,这意味着不允许变量!

答案 1 :(得分:1)

  

[...]其中gpio#,都被定义为整数[...]

我认为你的意思可能是:

const int gpio1 = 42;
const int gpio2 = 84;
const int gpio3 = 43;
// etc.

但是,由于xx在全局范围内初始化,因此会在编译时对其进行分配和初始化。但是,基于我的假设,gpio1和朋友在运行时被分配和初始化,所以显然编译器会告诉你它无法初始化xx

您需要使用常量表达式(或将扩展为文字常量的宏)才能使其正常工作。例如,您可以:

enum {
    gpio1 = 42, 
    gpio2 = 84, 
    gpio3 = 43, 
    // etc.
};

...或:

#define gpio1 42
#define gpio2 84
#define gpio3 43
// etc.

在你提问之前,label在此上下文中衰减为指向字符串文字的指针。这使它成为一个常量表达式,因此允许这样做。

答案 2 :(得分:0)

GPIOF_DIR_OUT,GPIOF_INIT_LOW,GPIOF_INIT_HIGH是宏,而不是函数。所以这不是原因。

我认为这个问题可能与gpio1~gpio10定义有关,这些东西是变量还是宏?

答案 3 :(得分:0)

生成gpio1const值,它将编译,例如:

const unsigned gpio1 = 1;