2010-05-02 3 views
2

Я работаю над преобразованием моего проекта Linux для компиляции в Windows с использованием MinGW. Он собирает и работает нормально на Linux, но когда я пытаюсь скомпилировать его с MinGW него бомбы с следующим сообщением об ошибке: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. Содержимое камеры.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 

Благодарим за помощь.

EDIT: Спасибо и Dirk и mingos, это была именно эта проблема!

+0

В этом нет ничего плохого. Вы пытались удалить элементы «Vector» и связанный с ними заголовок, чтобы исключить их как проблему? –

+0

Директива Include должна находиться под защитой заголовка. Если файл, включающий camera.h, также включает Vector.h, вы получите бесконечную рекурсию. – Eva

ответ

3

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

float my_near; 
float my_far; 

я помню Борланд с использованием "рядом" и "далеко" в качестве ключевых слов (мой 1992 Turbo C были эти, обратно в MS-DOS эры). Dunno, если это имеет место с gcc, но вы всегда можете попробовать это.

3

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

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

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

Попробуйте

#undef near 
#undef far 

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

+2

Если бы downvoters действительно могли оставить заметку о том, почему они были заблокированы, это будет действительно полезно. – Dirk

+0

Я думаю, что лучше использовать альтернативные имена переменных, а не деинфицировать их. –

1

В <windef.h>, вы найдете на следующих линиях:

#define NEAR 
#define near 

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

 Смежные вопросы

  • Нет связанных вопросов^_^