2013-04-23 6 views
2

Я запускаю Windows 7 64-bit и VS2012. При включении windows.h я получаю около 130 ошибок или около того. и, конечно же, не может скомпилировать проект.Сотни ошибок, включая windows.h

Прошло короткое исследование Google, и я увидел, что некоторые люди рекомендуют снова установить SDK. Я переустановил, но безрезультатно.

Затем я попытался заменить файл windows.h тем же файлом с компьютера моего друга, где он работает, но все же я получаю ошибки.

Затем я попытался заменить всю папку include: D, все равно получить те же 130 ошибок.

Я также убедился, что опция «Разрешить расширение языка» включена в настройках проекта.

Любые идеи?


Итак, я сделал еще несколько исследований. Если я начну новый проект и скомпилирую:

#include <windows.h> 

void main() 
{ 

} 

Он хорошо компилируется. Затем я включил свои 2 .h-файлы, а затем появлялись ошибки (я еще раз упомянул: не считая windows.h мой проект компилируется безупречно).

Мои два файла .h содержат 2 класса.

NumSet.h:

#pragma once 

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <algorithm> 

#define SIZE 5 

using namespace std; 

class NumSet 
{ 
    private: 
     int _arr[SIZE]; 
     int _numOfNumbers; 

    public: 
     NumSet(void); 
     ~NumSet(void); 

     int max();      //returns a player's max number. 

     bool insert(int newNum); 
     int freeCells(); 
     bool replace(int index, int newNum); 

     int min(); 

     float average(); 

     int biggerThan(int num); 

     int smallerThan(int num); 

     NumSet& operator+=(int num); 

     NumSet& operator++(); 

     NumSet& operator--(); 

     bool operator==(const NumSet& src)const; 

     NumSet operator=(const int * src); 

     NumSet& operator=(const NumSet& src); 

     bool del(int num); 

     friend ostream& operator<<(ostream& out, NumSet& numset); 

     friend istream& operator>>(istream& out, NumSet& numset); 
}; 

NumSet.cpp:

#include "NumSet.h" 

NumSet::NumSet(void) 
{ 

    for (int i=0;i<SIZE;i++)   //generating 5 random numbers between 1-10 and storing them in the array. 
    { 

     _arr[i] = (rand()%10) +1; 
    } 

    std::sort(&_arr[0],&_arr[5]);  //sorting the numbers. 

    _numOfNumbers = 5; 
} 

NumSet::~NumSet(void) 
{ 
} 

int NumSet::max() 
{ 
    int max = 0; 

    for (int i=0;i<SIZE;i++) 
    { 
     if (_arr[i]>max) 
     { 
      max = _arr[i]; 
     } 
    } 

    return max; 
} 

bool NumSet::insert(int newNum) 
{ 
    if (freeCells()==0) 
     return false; 

    _arr[_numOfNumbers-1] = newNum; 

    std::sort(&_arr[0],&_arr[5]); 
} 

int NumSet::freeCells() 
{ 
    if (_numOfNumbers==SIZE) 
     return 0; 

    return (SIZE-_numOfNumbers); 
} 

bool NumSet::replace(int index, int newNum) 
{ 
    if ((index<0 || index>SIZE) || (newNum<1 || newNum > 10)) 
     return false; 

    _arr[index] = newNum; 

    std::sort(&_arr[0],&_arr[5]); 
} 

int NumSet::min() 
{ 
    int min = 11; 

    for (int i=0;i<SIZE;i++) 
    { 
     if (_arr[i]<min) 
     { 
      min = _arr[i]; 
     } 
    } 

    return min; 
} 

float NumSet::average() 
{ 
    int sum = 0; 

    for (int i=0;i<SIZE;i++) 
    { 
     sum += _arr[i]; 
    } 

    return ((float)sum/SIZE); 
} 

int NumSet::biggerThan(int num) 
{ 
    int count = 0; 

    for (int i=0;i<SIZE;i++) 
    { 
     if (_arr[i]>=num) 
      count++; 
    } 

    return count; 
} 

int NumSet::smallerThan(int num) 
{ 
    int count = 0; 

    for (int i=0;i<SIZE;i++) 
    { 
     if (_arr[i]<num) 
      count++; 
    } 

    return count; 
} 

NumSet& NumSet::operator+=(int num) 
{ 
    this->insert(num); 

    return *this; 
} 



NumSet& NumSet::operator++() 
{ 
    for (int i=0;i<SIZE;i++) 
    { 
     _arr[i]++; 

     if (_arr[i]==11) 
     { 
      _arr[i]= 1; 
     } 
    } 

    return *this; 
} 

NumSet& NumSet::operator--() 
{ 
    for (int i=0;i<SIZE;i++) 
    { 
     _arr[i]--; 

     if (_arr[i]==0) 
     { 
      _arr[i]= 10; 
     } 
    } 

    return *this; 
} 

bool NumSet::operator==(const NumSet& src)const 
{ 
    if (_numOfNumbers != src._numOfNumbers) 
     return false; 

    for (int i =0;i<_numOfNumbers;i++) 
    { 
     if (_arr[i] == src._arr[i]) 
      continue; 

     else 
     { 
      return false; 
     } 
    } 

    return true; 
} 

NumSet NumSet::operator=(const int *src) 
{ 
    if (sizeof(src)>(sizeof(int)*SIZE)) 
     return *this; 

    NumSet newSet; 

    for (int i=0;i<SIZE;i++) 
    { 
     newSet._arr[i]= src[i]; 
    } 

    return newSet; 
} 

NumSet& NumSet::operator=(const NumSet& src) 
{ 
    for (int i=0;i<SIZE;i++) 
    { 
     _arr[i]=src._arr[i]; 
    } 

    _numOfNumbers=5; 

    return *this; 
} 

bool NumSet::del(int num) 
{ 
    if (num>SIZE) 
     return false; 

    _arr[num]=11;       //setting the number to be deleted to 11 (there's no another way that 11 can be present in the array). 

    std::sort(&_arr[0],&_arr[5]);   //sorting the array so the number to be deleted is in the end. 

    _numOfNumbers--;      //reducing the number of numbers in the array by 1, so the number to be deleted (the last in the array) will be ignored. 
} 

ostream& operator<<(ostream& out, NumSet& numset) 
{ 
    if (numset._numOfNumbers==0) 
     cout << "\n\nEmpty NumSet." << endl; 

    else 
    { 
     for (int i=0;i<numset._numOfNumbers;i++) 
     { 
      cout << numset._arr[i] << " "; 
     } 
    } 

    return out; 
} 

istream& operator>>(istream& in, NumSet& numset) 
{ 

    for (int i=0;i<numset._numOfNumbers;i++) 
    { 
     cout << "\n\nEnter your #" << i+1 << " number:" << endl; 
     int newnum; 
     cin >> newnum; 
     numset.replace(i, newnum); 
    } 

    return in; 
} 

game.h:

#pragma once 

#include "NumSet.h" 


using namespace std; 

class Game 
{ 
    private: 
     NumSet *player1, *player2; 

     void humanVShuman(); 

     void humanVSpc(); 

     void pcVSpc(); 

    public: 
     Game(void); 
     ~Game(void); 

     void game(int gameType); 


}; 

game.cpp:

#include "Game.h" 


Game::Game(void) 
{ 
    player1 = new NumSet; 
    srand(time(0)); 
    player2 = new NumSet; 
} 


Game::~Game(void) 
{ 
} 

void Game::game(int gameType) 
{ 
    if (gameType==1) 
     humanVShuman(); 

    else if (gameType==2) 
     humanVSpc(); 

    else if (gameType==3) 
     pcVSpc(); 
} 

void Game::humanVShuman() 
{ 
    system("cls"); 
    cout << *player1 << endl; 
    //Sleep(200); 
    cout << *player2 << endl; 
    system("PAUSE"); 
} 

void Game::humanVSpc() 
{ 

} 

void Game::pcVSpc() 
{ 

} 

И вот за интересную часть:

В main.cpp. До тех пор, как я делаю

#include "NumSet.h" 
#include "Game.h" 
#include <windows.h> 

Я получаю много ошибок в различных х файлов, таких как wingdi.h и winuser.h.

Если я не включаю в свои два h файла NumSet и Game, и просто включаю windows.h, он компилируется без ошибок.

Если я включаю только мои 2 h-файлы, он компилируется с ошибками.

Так что что-то в моих 2-х файлах прерывает с windows.h. Но что?

+1

Какие ошибки? – lapk

+1

Во-первых, вам действительно не нужно было переустанавливать SDK и, безусловно, не нужно было заменять windows.h с машины вашего друга. Если вы можете отменить замену windows.h, сделайте это. Затем добавьте свой код к этому вопросу. Осмосом мы не можем объяснить, что не так. –

+0

@CareyGregory +1 для добавления нового слова в мой словарь. – lapk

ответ

3

SIZE уже определен в windef.h. Вы не хотите переопределять его. Измените его на MY_SIZE или еще что-нибудь в вашем NumSet.h. Затем он компилируется на моей машине (vs2012 на Win7).

А также у вас есть имена функций, такие как max и min в вашем NumSet. Лучше избегайте их. У нас уже есть такие макросы, которые определены в стандартных заголовках. Попробуйте другие имена.Или это даст вам немного боли.

+0

Не включая файл заголовка OP _after_ 'windows.h' также решить эту проблему? Предоставлено, что 'SIZE' переопределяется, но это происходит после того, как включается материал' Windows.h'. –

+0

@BhargavBhat Нет. Согласно моему VS2012, включите заголовок после того, как 'windows.h' даст вам массу ошибок :) – gongzhitaao

+0

Интересно, спасибо за ввод, хотя. Не так просто, как я думал. –

2

Во-первых, я бы рекомендовал сделать windows.h первым, что вы включили. Таким образом, любые ошибки, которые вы получите, будут рассматриваться как ошибки в вашего кода, а не ошибки в windows.h, и таким образом вы можете их исправить.

Во-вторых, попробуйте использовать #define NOMINNMAX, прежде чем включать windows.h. Это предотвратит создание windows.h макросов min и max (имена которых откровенно невероятно ужасны, и MS должна чувствовать себя плохо для выбора этих имен). Таким образом, вы все равно можете использовать свои функции min и max (или, как предложили gongzhitaao, вы можете переименовать их в любом случае).

(предложение Gongzhitaao о использовать что-то другое, чем SIZE, вероятно, тоже верно.)

EDIT: Дополнительная информация о NOMINMAX: http://support.microsoft.com/kb/143208

+0

Обратите внимание, что какой-то код MS использует макросы 'min' и' max', поэтому это решение не всегда будет работать. Я думаю, что это верно только для кода MFC, хотя я мог ошибаться. –

+0

Заголовки gdiplus * .h используют их. Лучше всего #undef их после #include. –