Добрый день.
Интернеты вещают: этот древний идиотизм по дефолту выключен на всех моральных компиляторах.
Есть волшебный ключик для активации (вероятно - дать уважения настоящим ценителям),
но нигде нет ничего, что могло бы выключить эту пакость.
Сборка mingw482_32, Debug:
-std=c++1y -fopenmp -O0 -g3 -pedantic -Wall -Weffc++ -Wextra -Woverloaded-virtual -Wconversion -Wsign-conversion -Winit-self -Wunreachable-code -Wctor-dtor-privacy -Wnon-virtual-dtor -Wold-style-cast
Юнит-тестовое приложение линкуется с gmock
кусочек из юнит-теста:
... const str mask = " *?m.??/"; ...
Компилятор предупреждает:
предупреждение: trigraph ??/ converted to \ [-Wtrigraphs]
const str mask = " *?m.??/";
В результате такой метаморфозы сборка проваливается.
Как отключить этот маразм????
И почему оно вообще оказалось включенным????
Картинка слегка проясняется:
-trigraphs
Support ISO C trigraphs. The -ansi option (and -std options for strict ISO C conformance) implies -trigraphs.
Значит, -std=c++1y активировало триграфы.
Тогда возникает вопрос: как вырубить, или как врубить с++1y не включая триграфы?
Триграфы - это часть стандарта C++. -std=c++1y задает режим полной совместимости со стандартом и соответственно включает триграфы.
Используй -std=gnu++14 (или -std=gnu++1y для более древних версий gcc). Плюс -Wno-trigraphs для отключения варнингов, что триграфы проигнорированы.
в С++14 насколько я знаю убирают триграфы из стандарта
может mingw поновее поискать?
я правда не знаю как будет это убирание из стандарта выглядеть
потому как собираются оставлять кое какие костыли для совместимости
на усмотрение реализации
Не, в C++ 14 триграфы по прежнему есть. Их уберут только в C++ 17, комитет уже проголосовал за это. Костыли вроде не планируются. Кому надо - те должны будут конвертить исходники.
Проверил на gcc 4.9.2 с -std=c++14 - триграфы поддерживаются и компиляция фейлится, как и должно быть.
Спасибо.
Тогда такой вопрос: чем принципиально отличается гнутая версия? -std=gnu++1y
Гнутая версия отличается наличием гнутых расширений к стандартному C++. Никогда ими впрочем не пользовался, т.к. пишу строго по стандарту. К полному списку можно причаститься здесь:
https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html
Думаю, расширения для C тоже к ним относятся:
https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
Обычно на практике в типовом коде они ни на что не влияют. Хотя в различных спорных местах и corner cases могут проявиться, поэтому лучше компилировать с -std=c++14 все, что только возможно.
std::noob, спасибо
std::noob
>Думаю, расширения для C тоже к ним относятся:
Вроде открытым текстом написано:
Most of them are also available in C++
Информативность конечно...
Raw-string уже посоветовали?
Тема в архиве.