【问题标题】:MinGW and "declaration does not declare anything"MinGW 和“声明没有声明任何东西”
【发布时间】:2010-05-02 20:54:09
【问题描述】:

我正在使用 MinGW 将我的 Linux 项目转换为在 Windows 上编译。它在 Linux 上编译和运行都很好,但是当我尝试用 MinGW 编译它时,它会出现以下错误消息:

camera.h:11: error: declaration does not declare anything
camera.h:12: error: declaration does not declare anything

我有点困惑为什么会这样,因为

  1. 我在 Linux 和 Windows(通过 MinGW)上使用相同版本的 g++ (4.4)。
  2. camera.h 的内容非常简单。

这是代码。第 11 行和第 12 行令人窒息,其中定义了 float near;float far;

#include "Vector.h"

#ifndef _CAMERA_H_
#define _CAMERA_H_

class Camera{
public:
  Vector eye;
  Vector lookAt;
  float fov;
  float near;
  float far;
};

#endif

感谢您的帮助。

编辑:感谢 Dirk 和 mingos,这正是问题所在!

【问题讨论】:

  • 这显然没有问题。您是否尝试过删除 Vector 成员及其关联的标头以将它们排除为问题?
  • 包含指令应该在标题保护之下。如果包含camera.h的文件也包含Vector.h,则会得到无限递归。

标签: g++ compiler-errors mingw


【解决方案1】:

编辑如果你碰巧包含windef.h(直接或间接),你会发现

#define FAR
#define far
#define NEAR
#define near

那里。我认为,这是罪魁祸首。

试试

#undef near
#undef far

在你的类定义之前。

【讨论】:

  • 如果投反对票的人真的可以留下说明他们投反对票的原因,那真的很有帮助。
  • 我认为最好使用替代变量名称而不是取消定义它们。
【解决方案2】:

试着给他们起不同的名字,比如

float my_near;
float my_far;

我记得 Borland 使用“近”和“远”作为关键字(我的 1992 Turbo C 有这些,早在 MS-DOS 时代)。不知道 gcc 是否是这种情况,但您可以随时尝试。

【讨论】:

    【解决方案3】:

    <windef.h> 中,您会在以下几行中找到:

    #define NEAR
    #define near
    

    简单的答案:您不能 #undef 它们,因为它们是 Windows 标头的一部分(即使您 #undef 这些定义,_WINDEF_H 仍将被定义,因此如果您再次尝试#include <windef.h>,更不用说如果你#undef _WINDEF_H 在你的类定义之后使用#include <windef.h> 之前,你最终会得到像 RECT、LONG、PROC 等的重复定义,所以唯一的其他解决方案是更改变量名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2023-04-01
      • 2017-09-25
      • 2015-02-25
      • 2011-12-20
      相关资源
      最近更新 更多