【问题标题】:Error : Struct not defined correctly错误:结构未正确定义
【发布时间】:2013-02-28 01:55:27
【问题描述】:

我正在用 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”中的函数。

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

【问题讨论】:

  • 您的代码没有调用任何函数,请尝试使用GPIOF_DIR_OUT()
  • struct gpio 的定义是什么?另外我假设 gpio1~10 和 label 都是宏或枚举。它们不能是变量。

标签: c struct c-preprocessor gpio


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    [...] 其中 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 在此上下文中衰减为指向字符串文字的指针。这使它成为一个常量表达式,所以这个是允许的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        制作gpio1const值,它将编译,例如:

        const unsigned gpio1 = 1;
        

        【讨论】:

        • 定义为 const 的变量在 C 中不被视为常量表达式,所以不,这不起作用。
        • 嗯,我在发布之前编译了它并且它有效。仔细观察,clang 接受但gcc 不接受;都带有 -std=c99
        • gcc.gnu.org/bugzilla/show_bug.cgi?id=53091#c3。请注意,上述内容在 C++ 中是允许的。
        猜你喜欢
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        相关资源
        最近更新 更多