2017-02-22 9 views
0

MSVC에서 제대로 빌드되지만 MinGW로는 빌드하지 못하는 기존 C++ 및 Qt 프로그램이 있습니다.MSVC2013과 MingW의 차이로 인해 가장 많이 발생하는 구문 분석 문제가 발생합니다.

main.cpp:31: error: C2086: 'QString foo' : redefinition 
: 오류를 제공

//main.cpp 
#include <QString> 
#include <iostream> 

using namespace std; 

class MyClass { 

public: 
    MyClass(const QString &foo, const QString &bar, const QString baz) 
     : foo_(foo), bar_(bar), baz_(baz) {} 

    QString foo_; 
    QString bar_; 
    QString baz_; 
}; 

int main(int argc, char **argv) { 

    QString foo = QString("foo"); 
    QString bar = QString("bar"); 
    QString baz = QString("baz"); 

    MyClass my(foo, bar, baz); 

    QString a = QString(foo); 
    QString b = QString(bar); 
    QString c = QString(baz); 

    MyClass my2(a,b,c); 
    MyClass my3(QString(foo), QString(bar), QString(baz)); 
    //MyClass my4(QString(foo), QString(bar), QString(foo)); //redefinition error 

    return 0; 
} 

: 나는 최소한에 문제 작업 예를 추출한

Redefinition of 'QString foobar' 

:는 MinGW에서

나는 다음과 같은 구문 오류를 많이 얻을

주석에서 지적한 바와 같이 내 문제는 "대부분의 v"라는 구문 분석 문제로 인해 발생합니다. 파싱 ​​exing ". 이러한 지식을 바탕으로 MSVC와 MinGW간에 다음과 같은 차이점을 발견했습니다. 다음의 코드는 아니지만는 MinGW에서 MSVC2013에서 컴파일 :

MyClass my5(QString(foo), QString(bar), QString(foo), Foo::Foobar(5)); 

"푸 ::는 foobar (5)"MSVC는 변수 선언 등이 줄을 볼 수됩니다 추가,하지만는 MinGW는 여전히으로 이것을 보는 것 같다 함수 선언.

제 질문은 GCC의 일부 컴파일 플래그를 통해이 문제를 해결할 수 있습니까? 아니면 모든 프로젝트를 리펙토링하여 가장 복잡한 구문 분석 문제가 발생하지 않도록해야합니까? 이 함수의 문법 사양과 일치하므로

MyClass my4(QString(foo), QString(bar), QString(foo)); 

:

+0

바보 같은 질문 : QT는 MinGW 32Bit 용 라이브러리 만 포함하고 있으며 64 비트를 대상으로합니다. 이 문제를 해결 했습니까? –

+1

해당 프로그램을 제거하고 mcve를 생성해야합니다. http://stackoverflow.com/help/mcve –

+0

코드를 표시해야합니다. 코드가 유효하지 않으며 MSVC가 GCC만큼 엄격하지 않을 가능성이 있습니다. – rubenvb

답변

2

이 코드는 함수 선언 할 것이다. 자세한 내용은 "가장 애매한 구문 분석"을 참조하십시오. 이 오류는 함수 선언에 동일한 식별자가있는 두 개의 매개 변수를 사용할 수 없기 때문에 발생합니다. 명령문이 T name(U(으로 시작될 때마다 가능합니다.

MyClass my4(QString(foo), QString(bar), QString(foo), Foo::Foobar(5));의 오류는 gcc 컴파일러 버그 일 수 있으며, this similar issue을 상기시킵니다.

가,이 경우이 문제가 발생하지 않도록 중복 캐스트 방지하려면 :

MyClass my4(foo, bar, foo); 

을 아니면 목록 초기화 사용하는 습관을 얻을 수 :

MyClass my4{ foo, bar, foo }; 

주, 당신은 몇 가지 여분의 이전 캐스트했다 코드에서; 예 : QString foo = QString("foo");QString foo("foo"); 일 수 있습니다. a과 마찬가지로, b, c.