【问题标题】:C: Syntax error: identifier 'Block' [duplicate]C:语法错误:标识符“块”[重复]
【发布时间】:2016-04-25 16:26:54
【问题描述】:

我创建的结构有问题

typedef struct _BLOCK
{
    int size;
    int offset;
    Block *nextBlock;

} Block;

编译器无法识别 *nextBlock 指针的标识符

编译器似乎在程序中的任何一点都无法识别“块”结构,我在一些方法中将它用作参数,并且出现诸如“语法错误:在'*'之前缺少'{'”之类的错误.任何见解都会有所帮助

【问题讨论】:

  • _ 开头的名称加上一个大写字母或另一个下划线保留用于实现。 不要使用它们

标签: c syntax


【解决方案1】:

你少了一个分号:

struct _BLOCK *nextBlock;

【讨论】:

  • @David 另外,这应该是struct _BLOCK *nextBlock;,因为编译器从上到下读取,当它看到Block *nextBlock; 时,它会像'嘿,Block 是什么?我还没有看到它在任何地方定义'并且会抛出错误。
  • @CoolGuy 是的,你的权利,感谢帮助
【解决方案2】:

缺少的分号没有帮助,但你有一个更大的问题。

typedef 名称Block 直到结构定义完成之后 才引入,因此您不能在nextBlock 的声明中使用它。此时你有两个选择:

  1. 使用struct _BLOCK 声明:
    struct _BLOCK *nextBlock;
  2. 转发声明结构和typedef名称:
    struct _BLOCK;
    typdef struct _BLOCK Block;
    struct _BLOCK {
      ...
      Block *nextBlock;
      ...
    };
    

尼特:

不要在变量或类型名称中使用前导下划线;这些名称是为实现而保留的。 IOW,编译器可能会为自己的目的定义一个符号_BLOCK,而您对_BLOCK 的使用可能会导致命名空间冲突。请改用struct BLOCKstruct Block 或类似的东西。

另外,请谨慎使用 typedef。如果使用Block 的任何人都必须知道它是struct 类型,那么您最好只使用struct Block。以FILE类型为例;您不打算直接操作FILE 对象的内容,您只需将指向它的指针传递给各种stdio 例程。作为程序员,您不需要知道 FILE 对象在内部的样子,因此在这种情况下,将其隐藏在 typedef 后面是合适的。

如果使用您的Block 类型的任何人必须直接访问sizeoffsetnextBlock 成员,那么最好将其struct-ness 明确。 OTOH,如果您提供 API 来操作或访问块成员(类似于 FILE 类型和 stdio 例程),那么 typedef 就可以了。

从不将指针隐藏在 typedef 后面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多