【问题标题】:request for member n something not a structure or union请求成员 n 不是结构或联合的东西
【发布时间】:2019-05-11 06:54:16
【问题描述】:

我有一个这样定义的结构:

typedef struct spi_device device_t;

struct spi_device {
  int a;
  int b;
  int c;
};

在包含文件中定义。

在源文件中,

static device_t my_main_dev = 
{
  .a = 2,
  .b = 3,
  .c = 4,    
};

我已确保源文件中包含包含文件。

但是,当我编译此代码时,我收到错误“请求成员 'a' 不是结构或联合”。我无法纠正这个问题。

我读过几篇讨论这个问题的帖子,但没有一篇说当我们在结构对象初始化过程中遇到错误时我们可以做什么。感谢您提供这方面的任何帮助。

【问题讨论】:

  • 你的编译标志是什么?特别是,您的编译是 c99 还是更高版本?
  • 没有特定的编译器标志。我正在使用默认选项。我只是提供“-ggdb -Wall -Werror”选项。
  • 尝试添加-std=c99-std=c11
  • 你用的是什么编译器?什么版本的编译器?

标签: c compiler-errors


【解决方案1】:

您没有提供存在问题的可编译源文件。诊断可能与源文件的其他部分有关,而不是您发布的内容。

如果警告确实指向发布的代码,这里有一些可能的解释:

  • 您的编译器不支持 C99 扩展。这些在今天相当少见,但一些针对嵌入式处理器的旧编译器很笨重,而且像老猴子一样,无法教授新技巧。
  • 您的编译器配置为拒绝 c99 扩展(使用 -std=c89-ansi)。

要解决这些限制,您可以使用结构初始化器的经典语法:

static device_t my_main_dev = { 2, 3, 4 };

【讨论】:

  • 现在很难找到这样的编译器。甚至 gcc 4.6 默认也支持它。 godbolt.org/z/Z9XbaQ
  • @P__J__:当然,现代编译器已经支持这种语法很长一段时间了......我用更多的可能性更新了我的答案
【解决方案2】:

这是一个愚蠢的错误。我错过了其中一个字段的逗号。放回去解决了编译器错误。给您添麻烦了。

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多