2017-02-22 26 views
0

У меня есть существующая программа на C++ и Qt, которая строит под MSVC, но не работает с MinGW.Различия между MSVC2013 и MingW приводят к самой неприятной проблеме синтаксического анализа

Под MinGW я получаю много ошибок синтаксиса, такие как:

Redefinition of 'QString foobar' 

Я извлек вопрос в минимум работающий пример:

//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; 
} 

который дает ошибку:

main.cpp:31: error: C2086: 'QString foo' : redefinition 

Как указано в комментариях, моя проблема вызвана проблемой синтаксического анализа, которая называется «most v исключая синтаксический анализ ". Благодаря этим знаниям я уточнил свою проблему и нашел следующую разницу между MSVC и MinGW. Следующая строка кода компилировать под MSVC2013 но не под MinGW:

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

кажется, что добавление «Foo :: Foobar (5)» вызывает MSVC, чтобы увидеть эту строку в качестве объявления переменной, но MinGW до сих пор считает, что это объявления функции.

Вопрос в том, могу ли я обойти эту проблему с помощью некоторого флага компиляции в GCC, или мне нужно реорганизовать весь мой проект, чтобы избежать самой неприятной проблемы синтаксического анализа.

+0

Глупый вопрос: QT включает только библиотеки для MinGW 32Bit, и вы нацеливаете 64 бита. Вы решили эту проблему? –

+1

Вам следует попытаться снять эту программу и создать mcve: http://stackoverflow.com/help/mcve –

+0

Вам нужно показать нам код. Скорее всего, ваш код недействителен, и MSVC не так строг, как GCC. – rubenvb

ответ

2

Этот код будет функция объявления:

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

, потому что он соответствует спецификации грамматики для функции. Посмотрите «самый неприятный синтаксический разбор» для получения дополнительной информации. Ошибка состоит в том, что объявление функции не может иметь два параметра с тем же идентификатором. Когда начнется заявление с 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.