不同的 IDE 产生 0 个错误与 28 个错误

Posted

技术标签:

【中文标题】不同的 IDE 产生 0 个错误与 28 个错误【英文标题】:Different IDEs generating 0 errors vs 28 errors 【发布时间】:2016-07-14 13:47:09 【问题描述】:

我正在尝试从 Eclipse 转到 Visual Studio,因为有人告诉我,新手到中级更容易,我从最初的印象中同意。我正在尝试使用类重建经典的井字游戏构建,就像测试文件一样,以感受 IDE,我在 Visual Studio 中收到 28 个错误和 1 个警告,而在 Eclipse 中没有错误和 1 个警告...代码是完全相同的。我完全糊涂了。

需要明确的是,它在 Eclipse 中编译和运行,同时在 Visual Studio 中收到 28 个错误。

为什么会这样?

代码如下

错误列表

Severity    Code    Description Project File    Line    Suppression State
Error   C2065   'moveCounter': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   167 
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   10  
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   11  
Error   C2550   'TicTacToe': constructor initializer lists are only allowed on constructor definitions  TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   13  
Warning C4508   'TicTacToe': function should return a value; 'void' return type assumed TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   14  
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   16  
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   24  
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   29  
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   34  
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   38  
Error   C3861   'getPlayerMove': identifier not found   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   48  
Error   C3861   'checkForWin': identifier not found TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   50  
Error   C3861   'checkForTie': identifier not found TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   56  
Error   C3861   'togglePlayer': identifier not found    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   63  
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   70  
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   98  
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   100 
Error   C2065   'moveCounter': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   105 
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   116 
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   124 
Error   C2065   'moveCounter': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   128 
Error   C3861   'checkLineForWin': identifier not found TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   138 
Error   C3861   'checkLineForWin': identifier not found TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   146 
Error   C3861   'checkLineForWin': identifier not found TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   151 
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   157 
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   159 
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   160 
Error   C2065   'squareArray': undeclared identifier    TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   161 
Error   C2653   'TicTacToe': is not a class or namespace name   TicTacToeWithClasses    c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp   164

主要

// TicTacToeWithClasses.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include "TicTacToe.h"

bool getUserWantToPlay();

int main()


    while (getUserWantToPlay())
    

        TicTacToe game;
        game.playGame();

    

    return(0);


bool getUserWantToPlay()


    //Assumes no play until response received
    char response;
    bool invalidResponse = true;
    bool play = false;

    while (invalidResponse)
    

        std::cout << "Would you like to play a new game of TicTacToe? (y/n) " << std::endl;
        std::cin >> response;

        if (response == 'y')
        
            invalidResponse = false;
            play = true;
        
        else if (response == 'n')
        

            std::cout << "No Problem!" << std::endl;
            invalidResponse = false;
        
        else
        
            std::cout << "Please input a proper response (y/n) " << std::endl;
        
    

    return play;

标题

#ifndef TICTACTOE_H_
#define TICTACTOE_H_


class TicTacToe


    public:
        TicTacToe();
        void playGame();

    private:
        void drawBoard();
        void getPlayerMove(char player);
        char togglePlayer(char player);

        bool checkForWin(char player);
        bool checkLineForWin(int square1, int square2, int square3, char player);
        bool checkForTie();

        char squareArray[9];
        int moveCounter;

;

#endif

类实现

//TicTacToe class implementation

#include "TicTacToe.h"
#include "stdafx.h"
#include <iostream>

static const int MinMovesNeededToWin = 5;
static const int MaxMovesInGame = 9;

TicTacToe::TicTacToe()
: squareArray '1','2','3','4','5','6','7','8','9' ,
moveCounter(0)



void TicTacToe::drawBoard()


    //Draws the game board with updated characters for each player

    std::cout << "Player 1 (X) - Player 2 (O)" << std::endl << std::endl << std::endl;

    std::cout << "    |     |" << std::endl;
    std::cout << " " << squareArray[0] << "  |  " << squareArray[1] << "  |  " << squareArray[2] << std::endl;

    std::cout << "____|_____|____" << std::endl;
    std::cout << "    |     |    " << std::endl;

    std::cout << " " << squareArray[3] << "  |  " << squareArray[4] << "  |  " << squareArray[5] << std::endl;

    std::cout << "____|_____|____" << std::endl;
    std::cout << "    |     |    " << std::endl;

    std::cout << " " << squareArray[6] << "  |  " << squareArray[7] << "  |  " << squareArray[8] << std::endl;



void TicTacToe::playGame()


    char player = 'X';
    bool gameOver = false;

    do
    

        drawBoard();
        getPlayerMove(player);

        if (checkForWin(player))
        

            std::cout << std::endl << "Congratulations player " << player << "! You win!" << std::endl;
            gameOver = true;
        
        else if (checkForTie())
        

            std::cout << "Tie!  You should play again to settle the duel!" << std::endl;
            gameOver = true;

        
        player = togglePlayer(player);

    while (!gameOver);

    drawBoard();


void TicTacToe::getPlayerMove(char player)


    //Gets player move and stores in board array for display through next iteration

    bool playerMoveFound = false;
    char playerTurn = '0';
    char playerMove = '0';

    if (player == 'X')
    
        playerTurn = '1';
    
    else
    
        playerTurn = '2';
    

    while (playerMoveFound == false)
    

        std::cout << "Player " << playerTurn << " please make a move" << std::endl;
        std::cin >> playerMove;

        for (int counter = 0; counter < 9; counter++)
        

            //If finds the array number makes the change to the iteration...prevents x or o movement
            if (playerMove == squareArray[counter] && playerMove != 'X' && playerMove != 'O' && playerMove != 'x' && playerMove != 'o')
            
                squareArray[counter] = player;

                playerMoveFound = true;

                //Move counter implemented to streamline check for win/check for tie
                moveCounter++;
            
        

        if (playerMoveFound == false)
        
            std::cout << "Invalid player move..." << std::endl;
        
    


char TicTacToe::togglePlayer(char player)


    player = player == 'X' ? 'O' : 'X';

    return(player);


bool TicTacToe::checkForWin(char player)

    bool playerWin = false;

    if (moveCounter >= MinMovesNeededToWin)
    

        // Only need to check for current player
        // Only need to check until we have a win

        // Tests rows for win
        for (int rowCounter = 0; !playerWin && rowCounter < 8; rowCounter += 3)
        

            playerWin = checkLineForWin(rowCounter, rowCounter + 1, rowCounter + 2, player);

        

        // Tests columns for win
        for (int columnCounter = 0; !playerWin && columnCounter < 3; columnCounter++)
        

            playerWin = checkLineForWin(columnCounter, columnCounter + 3, columnCounter + 6, player);

        

        // Tests diagnols for win
        playerWin |= (checkLineForWin(0, 4, 8, player) | checkLineForWin(2, 4, 6, player));
    

    return(playerWin);


bool TicTacToe::checkLineForWin(int square1, int square2, int square3, char player)

    return squareArray[square1] == player &&
        squareArray[square2] == player &&
        squareArray[square3] == player;


bool TicTacToe::checkForTie()


    return moveCounter == MaxMovesInGame;


【问题讨论】:

你的类实现文件可能没有编译,因为stdafx.h没有被首先包含;更改包含的顺序,以便将stdafx.h 包含在之前 TicTacToe.h @ildjarn 哇...修复了!哈哈谢谢你!请问为什么会这样?请把它作为答案发布,这样我就可以给你信用了。究竟什么是 stdafx.h?明明是头文件,但是里面有什么?我在 Eclipse 中没有看到。 它与预编译的头文件一起使用。见stdafx.h: When do I need it? 参见Precompiled Header Files 和Using Precompiled Headers in a Project。也强烈推荐:Does Visual Studio Rot the Mind?. 除了问题的答案 (PCH) 之外,还值得记住的是,不同的编译器会检测到不同的问题并发出不同的警告。编译器也有不同的错误,一个可能会接受另一个拒绝的损坏代码。在高警告级别使用多个编译器进行测试通常是一件好事(我经常使用 clang、gcc 和 VC++ 编译所有代码,这样做会捕获错误)。 【参考方案1】:

在 Visual C++ 中,当precompiled headers 被启用时(它们通常默认为stdafx.h),您的PCH 必须是每个翻译单元中包含的first 标头。如果您忘记完全包含 PCH,您会收到一个合理的 C1010 错误告诉您;但是,不幸的是,当您仅以错误的顺序包含标头时,没有合理的诊断输出可以告诉您为什么事情会失败。

更改类实现 TU 中包含的顺序,以便将 stdafx.h 包含在 之前 TicTacToe.h。进一步阅读有关 VC++ 上下文中的预编译头文件可以找到here。

【讨论】:

或者,指定/FI (Name Forced Include File) 编译器选项。这在编译您无法修改但仍想使用预编译头文件的第 3 方库代码时特别有趣。

以上是关于不同的 IDE 产生 0 个错误与 28 个错误的主要内容,如果未能解决你的问题,请参考以下文章

机器学习笔记模型评估与选择

typedef和define混用产生的错误

Oracle不同版本执行相同SQL语句,结果不一样,请大神赐教

程序员面试最常犯的十大错误,你是不是也这样?

滥用指针会产生分段错误。我仍然不确定如何纠正它

错误记录TabLayout 升级支持库版本后报错 ( support:design 支持库升级到 28.0.0 后源码发生变更 )