MinGW и «декларация ничего не декларирует» - PullRequest
3 голосов
/ 03 мая 2010

Я работаю над преобразованием моего проекта Linux для компиляции в Windows с использованием MinGW. Он компилируется и прекрасно работает в Linux, но когда я пытаюсь скомпилировать его с MinGW, он вылетает со следующим сообщением об ошибке:

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

Я немного сбит с толку, почему это происходит, потому что

  1. Я использую одну и ту же версию g ++ (4.4) как для Linux, так и для Windows (через MinGW).
  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

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Спасибо и Дирк и Минго, это была именно проблема!

Ответы [ 3 ]

4 голосов
/ 03 мая 2010

Изменить Если вы включите windef.h (прямо или косвенно), вы найдете

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

есть. Я думаю, что это виновник.

Попробуйте

#undef near
#undef far

до определения вашего класса.

3 голосов
/ 03 мая 2010

Попробуйте дать им разные имена, например

float my_near;
float my_far;

Я вспоминаю, как Borland использовал «близко» и «далеко» в качестве ключевых слов (у моего Turbo C 1992 года они были еще в эпоху MS-DOS). Не знаю, так ли это с gcc, но вы всегда можете попробовать это.

1 голос
/ 03 мая 2010

В <windef.h> вы найдете следующие строки:

#define NEAR
#define near

Простой ответ: вы не можете #undef их, потому что они являются частью заголовков Windows (_WINDEF_H по-прежнему будет определяться, даже если вы #undef эти определения, поэтому он не будет повторно включен, если вы попробуйте #include <windef.h> еще раз, не говоря уже о том, что если вы #undef _WINDEF_H перед использованием #include <windef.h> после определения класса, вы получите дубликаты определений для таких вещей, как RECT, LONG, PROC и другие), поэтому Единственное другое решение - изменить имена переменных.

...