2015-02-07 2 views
1

Итак, в Интернете есть библиотека для обработки растровых файлов: "bitmap_image.hpp". Мне кажется, это хорошо, и это хорошо работает для моего проекта, пока я не попытаюсь включить «Windows.h» в свой проект. Компилятор не может идентифицировать как класс «bitmap_image», так и «POINT», которые поступают из «bitmap_image.hpp» и «Windows.h» соответственно.Синтаксические ошибки после включения <Windows.h>

Я пробовал все, что знаю, но проблема все еще не решена. Кроме того, при попытке скомпилировать другой проект, который включает ТОЛЬКО cstdio, bitmap_image.hpp и Windows.h, он работает.

я использует Qt и вот весь код:

main.cpp

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QtDebug> 
#include "bitmap_image.hpp" 
#include <Windows.h> 

using namespace std; 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 

}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

double compare_bitmap(bitmap_image& large, bitmap_image& small, unsigned int top_left_x, unsigned int top_left_y) 
{ 
    /* 
    Purpose: 
     compare two bitmaps and return the percentage of matched pixels 

    Description: 
     this function concerns the pixels in "large" only if it falls in this square-- 
     top-left:  (top_left_x, top_left_y) 
     bottom-right: (top_left_x+small.width()-1, top_left_y+small.height()-1) 

     while all pixels in "small" will be concerned 

    Rules: 
     "large" should not be smaller than "small" in either dimensions 
     top_left_x should be ranged from 0 to (large.width()-small.width()) 
     top_left_y should be ranged from 0 to (large.height()-small.height()) 
    */ 

    if(large.width()<small.width() || large.height()<small.height()) return -1; 
    if(top_left_x<0 || top_left_x>(large.width()-small.width()) || top_left_y<0 || top_left_y>(large.height()-small.height())) return -2; 

    double pixel_count = 0; 
    double matched_count = 0; 

    for(unsigned int y=0; y<small.height(); ++y) 
    { 
     for(unsigned int x=0; x<small.width(); ++x) 
     { 
      if(large.get_pixel(top_left_x+x, top_left_y+y)==small.get_pixel(x,y)) ++matched_count; 
      ++pixel_count; 
     } 
    } 

    return matched_count/pixel_count; 
} 

bool identify_bitmap(bitmap_image& large, bitmap_image& small, POINT& result_point, double min_match_percent = 1.0) 
{ 
    if(large.width()<small.width() || large.height()<small.height()) return false; 

    unsigned int p_x, p_y; 
    double match_percent = 0; 

    for(unsigned int y=0; y<(large.height()-small.height()+1); ++y) 
    { 
     for(unsigned int x=0; x<(large.width()-small.width()+1); ++x) 
     { 
      double percent = compare_bitmap(large, small, x, y); 
      if(percent>match_percent) 
      { 
       p_x = x; 
       p_y = y; 
       match_percent = percent; 
      } 
     } 
    } 

    if(match_percent<min_match_percent) return false; 

    result_point.x = p_x; 
    result_point.y = p_y; 
    return true; 
} 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    string s = "capture_2.bmp"; 
    bitmap_image image(s); 

    if(!image) qDebug()<<"failed"; 
    else qDebug()<<"succeed"; 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
+2

Редактировать ваш вопрос, чтобы показать именно сообщения об ошибках от компилятора. Компиляция со всеми предупреждениями и информацией об отладке (например, 'g ++ -Wall -Wextra -g') –

+0

Возможный дубликат http://stackoverflow.com/questions/24186250/include-windows-h-causes-a-lot-of-syntax -errors –

ответ

0

Обновление: Я просто нахожу решение для себя. Извините за сообщение.

Решение: The first post to this thread заявил, что мы можем #define WIN32_LEAN_AND_MEAN непосредственно перед #include <Windows.h>

Хотя я не совсем понимаю причины ...

+1

Причина в том, что '' определяет большое количество макросов. И макросы не уважают пространства имен, они эффективно глобальны, это то, что иногда называют _global namespace pollution_. Тройка 'WIN32_LEAN_AND_MEAN' предотвращает большинство этих макросов nocive. – rodrigo

+0

oic, глобальное загрязнение пространства имен, интересный термин. Благодаря ~ – Samuel