【问题标题】:error: expected ')' before '*' token错误:在 '*' 标记之前应为 ')'
【发布时间】:2010-09-15 17:11:43
【问题描述】:

我有这个包含文件 (memory .h)

#ifndef MEMORY_H
#define MEMORY_H

#ifdef  __cplusplus
extern "C" {
#endif

    typedef struct mmemory {
        int* cells;
        int* current_cell;
        int cells_number;
    } memory;

    void memory_init(memory* mymemory, int size);
    void step_left(memory* mymemory, int steps);
    void step_right(memory* mymemory, int steps);
    void cell_inc(memory* mymemory, int quantity);
    void print_cell(memory* mymemory);
    void get_char(memory* mymemory);


#ifdef  __cplusplus
}
#endif

#endif  /* MEMORY_H */

还有这个实现文件(memory.c

#include <stdlib.h>
#include "memory.h"

void
memory_init (memory* mymemory, int size)
{
    mymemory->cells = (int*) malloc (sizeof (int) * size);
    mymemory->cells_number = size;
    mymemory->current_cell = (int*) ((mymemory->cells_number / 2) * sizeof (int));
}
... //other function definitions follow

当我尝试编译 memory.c 时,每个函数定义都会出现此错误

src/memory.c:5: 错误:在 '*' 标记之前需要 ')'

第 5 行是memory_init() 的函数定义

谁能告诉我为什么会出现这个错误?

【问题讨论】:

  • 在 OSX Snow Leopard 上的 gcc 版本 4.2.1,带有 -ansi 开关
  • 在您的标头被包含之前,也许其他一些标头已经定义了 MEMORY_H?

标签: c


【解决方案1】:

因为系统memory.h 正在隐藏您的memory.h,导致#include 在没有声明您的类型的情况下成功。几个可能的修复:

  • 重命名您的文件 - 在任何情况下都可能是最好的,以减少潜在的混淆。
  • 通过前缀子目录(例如,#include &lt;myproj/memory.h&gt;)包含您的文件。
  • 将您的文件移动到与源文件相同的目录中,使#include 包裹在" 中的文件名的优先规则生效。
  • 确保您的 C 预处理器包含路径选项将您的项目头文件路径放在系统头文件路径之前。

【讨论】:

  • 为避免将来出现问题,是否有标准 C 标头名称的快速参考?
  • @klez 这似乎是一个现有的问题:stackoverflow.com/questions/2027991/…。但是在这种情况下,与标准相关的列表不会有帮助,因为memory.h 不是标准标题。您可以随时查看特定操作系统提供的内容,例如 find /usr/include/ -type f -name '*.h'
  • 当然,前提是您的特定操作系统具有find,并将标头保存在/usr/include/ 中。并非所有人都有幸运行这样的操作系统。
【解决方案2】:

这个答案确实晚了,但我遇到了类似的问题。

我认为您的问题与您声明结构 mmemory 的 .h 文件中的拼写错误有关。如果您删除多余的“m”,它应该可以工作。

【讨论】:

  • 你的回答真的晚了,问题不在于 :-) 还是谢谢
【解决方案3】:

在您的代码中,您已经为 memory.h 定义了这样的代码

#ifndef MEMORY_H
#define MEMORY_H
...
...
#endif

如果您在项目中使用的任何其他文件具有相同的#define,即 MEMORY_H,那么您可能会收到此错误。

解决方案:

#ifndef XYZ_MEMORY_H
#define XYZ_MEMORY_H
...
...
#endif

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2014-01-16
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多