Komppluję projekt, który został pierwotnie opracowany za pomocą MSVC 2008. Próbuję zaktualizować go do MSVC 2017. Kiedy próbuję zbudować, widzę:

Severity    Code    Description Project File    Line    Suppression State
Error   C2143   syntax error : missing ';' before 'namespace'   Debug Service Group c:\program files (x86)\microsoft visual studio 12.0\vc\include\yvals.h  568 
Severity    Code    Description Project File    Line    Suppression State
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    Debug Service Group c:\program files (x86)\microsoft visual studio 12.0\vc\include\yvals.h  568 

Przez CPP i nagłówki i nie widzę nic złego, prototypu:

#if !defined(DURATION_H)
#define DURATION_H
////////////////////////////////////////////////////////////////////////////////
/// \class  Duration
/// \brief  Win32 implementation of the Duration class
///
class Duration {
public:
    /// \param  Duration of what we are trying to measure
    Duration(const std::string &a_str = "");
    /// Destructor outputs how long the object was alive
    ~Duration();

private:
    class Writer
    {
    public:                                     // Core is agnostic to the presence of outside world
        Writer(const std::string &a_fileName = "");
        void write(const std::string &a_text) const;
    private:
        std::string m_fileName;         ///< Output file name
    };

    unsigned long m_start;                      ///< Start time
    std::string m_str;                  ///< Duration of what we are trying to measure
};

#endif // defined(DURATION_H)

Realizacja:

////////////////////////////////////////////////////////////////////////////////
/// \file   duration.cpp
/// \brief  Concrete (Win32) class implementing Duration
//
//  Revision history:
//
#include <boost/lexical_cast.hpp>

#include "duration.h"

#include "getwindows.h"

#pragma warning(disable: 4996)

////////////////////////////////////////////////////////////////////////////////
/// \class  Duration
/// \brief  Win32 implementation of the Duration class
///
Duration::Duration(const std::string &a_str) :
    m_start(GetTickCount()), m_str(a_str) {
}

/// Destructor outputs how long the object was alive
Duration::~Duration() {
    unsigned long elapsed(GetTickCount() - m_start);
    std::string strElapsed = boost::lexical_cast<std::string>(elapsed);
    Writer w("timingstats.txt");
    w.write(m_str + " took: " + strElapsed);
}

Duration::Writer::Writer(const std::string &a_fileName) : m_fileName(a_fileName) {
}

void Duration::Writer::write(const std::string &a_text) const {
    if (m_fileName.length() > 0) {
        FILE *fd(fopen(m_fileName.c_str(), "ab"));
        if (fd) {                           // Open file in append mode, write the string
            std::string buf(a_text);        // and close the file asap
            buf += "\r\n";
            fwrite(buf.c_str(), buf.size(), 1, fd);
            fclose(fd);
        }
    }
}
c++
0
SPlatten 3 sierpień 2020, 08:44

1 odpowiedź

Najlepsza odpowiedź

c:\program files (x86)\microsoft visual studio 12.0\vc\include\yvals.h 568 mówi ci, że błąd znajduje się w nagłówku dostarczonym ze starą wersją Visual Studio.

Niestety, całkowicie oczekiwano, ponieważ stare nagłówki zawierają wiele błędów składniowych, które nie zgodny kompilator, taki jak Pre-VS2015 MSVC, może nadal obsługiwać tylko całkowicie ustalone od VS2017.

Z tego powodu będziesz musiał nie tylko otworzyć projektu w VS2017, ale także zmienić aktywny łańcuch narzędzi do V141 i wyczyścić wszystkie potencjalnie twarde zakodowane ścieżki do starej, obejmują katalogi.

Może być szybszy, aby po prostu utworzyć projekt od podstaw w VS2017, a następnie tylko do ponownego dodania istniejących plików źródłowych.

1
Ext3h 3 sierpień 2020, 05:50