Войти
ПрограммированиеФорумОбщее

[c++, mingw, trigraph][ненависть] как отключить триграфы?

#0
19:40, 21 фев 2015


Добрый день.

Интернеты вещают: этот древний идиотизм по дефолту выключен на всех моральных компиляторах.

Есть волшебный ключик для активации (вероятно - дать уважения настоящим ценителям),
но нигде нет ничего, что могло бы выключить эту пакость.

Сборка 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.??/";

В результате такой метаморфозы сборка проваливается.


Как отключить этот маразм????
И почему оно вообще оказалось включенным????

#1
20:02, 21 фев 2015

Картинка слегка проясняется:

-trigraphs
Support ISO C trigraphs. The -ansi option (and -std options for strict ISO C conformance) implies -trigraphs.


Значит, -std=c++1y активировало триграфы.

Тогда возникает вопрос: как вырубить, или как врубить с++1y не включая триграфы?

#2
20:17, 21 фев 2015

Триграфы - это часть стандарта C++. -std=c++1y задает режим полной совместимости со стандартом и соответственно включает триграфы.

Используй -std=gnu++14 (или -std=gnu++1y для более древних версий gcc). Плюс -Wno-trigraphs для отключения варнингов, что триграфы проигнорированы.

#3
20:24, 21 фев 2015

в С++14 насколько я знаю убирают триграфы из стандарта
может mingw поновее поискать?
я правда не знаю как будет это убирание из стандарта выглядеть
потому как собираются оставлять кое какие костыли для совместимости
на усмотрение реализации

#4
20:38, 21 фев 2015

Не, в C++ 14 триграфы по прежнему есть. Их уберут только в C++ 17, комитет уже проголосовал за это. Костыли вроде не планируются. Кому надо - те должны будут конвертить исходники.

Проверил на gcc 4.9.2 с -std=c++14 - триграфы поддерживаются и компиляция фейлится, как и должно быть.

#5
21:12, 21 фев 2015

Спасибо.

Тогда такой вопрос: чем принципиально отличается гнутая версия? -std=gnu++1y

#6
0:14, 22 фев 2015

Гнутая версия отличается наличием гнутых расширений к стандартному 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 все, что только возможно.

#7
0:16, 22 фев 2015

std::noob, спасибо

#8
0:24, 22 фев 2015

std::noob
>Думаю, расширения для C тоже к ним относятся:
Вроде открытым текстом написано:

Most of them are also available in C++

Информативность конечно...

#9
12:58, 22 фев 2015

Raw-string уже посоветовали?

ПрограммированиеФорумОбщее

Тема в архиве.