У меня есть существующая программа на 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, или мне нужно реорганизовать весь мой проект, чтобы избежать самой неприятной проблемы синтаксического анализа.
Глупый вопрос: QT включает только библиотеки для MinGW 32Bit, и вы нацеливаете 64 бита. Вы решили эту проблему? –
Вам следует попытаться снять эту программу и создать mcve: http://stackoverflow.com/help/mcve –
Вам нужно показать нам код. Скорее всего, ваш код недействителен, и MSVC не так строг, как GCC. – rubenvb