【问题标题】:Structure scope结构范围
【发布时间】:2012-12-24 10:09:17
【问题描述】:
#include <stdio.h>
#include "prique.h"

void main()
{
    _pqueue *test;
    queue_init(&test);
    ...

我不知道为什么会收到此错误。

错误:在 '{' 之前应有 '='、','、';'、'asm' 或 'attribute' 令牌|

头文件的结构是

typedef struct _pqueue
{
    int size;
    struct queue_node *first;
}_pqueue;

我已经正确定义了结构。我看到一些讨论,这个错误与范围有关,但不知道如何修复它。

【问题讨论】:

  • 如果您分享结构可能会有所帮助。还要避免只是复制/粘贴问题标题中的错误。它不属于那里。确切的错误(显示在您的屏幕上)属于问题的正文。
  • 您的prique.h 中有什么内容?您是否关闭了所有以 ; 结尾的结构定义?
  • 带有前导下划线的标识符是为语言和实现保留的(结构名称可能是一个例外?)。此外,main() 应该返回 int。
  • @wildplasser:更准确地说,在标准中,以下划线和小写字母开头的标识符如果具有文件范围,则保留。
  • 结构标签存在于单独的名称空间中(自 C89/ANSI、IIRC 起),但现在看来 OP 使用与 typedef 相同的结构名称,即是 - 至少 - 一个非常坏的习惯。 (就像 typedef 在大多数情况下是一个坏习惯一样)

标签: c scope structure


【解决方案1】:

不确定是不是这里的问题,但是有些编译器不识别 void main(),所以:

int main()

否则它可能在您的 prique.h 模块中...

此外,如果您的 queue_node 以相同的方式定义(typedef struct queue_node {...} queue_node),那么您可能不需要 struct 关键字:

typedef struct _pqueue
{
    int size;
    queue_node *first;
} _pqueue;

【讨论】:

  • 还有第二个违反 C 正确性的问题。前导 _ 保留给编译器实现,程序员不应使用。这和void main 都不是他的错误消息的原因。
【解决方案2】:

您必须知道您也可以编译您的 *.h 文件。这样做:

gcc -Wall prique.h

确保你的头文件声明都是正确的。

【讨论】:

    【解决方案3】:

    我猜queue_nodepqueue 相同。如果是这样的话 那么这应该可以解决问题。如果没有,那么 queue_node 可能没有在您的包含文件中定义。

    下面的代码可能就是你想要的。

    typedef struct pqueue {
        int size;
        struct pqueue *first;
    } pqueue_t;
    
    void
    main()
    {
        pqueue_t *test;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多