crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> trigraphs, триграфы в C/C++
Andrew Selivanov
  опции профиля:
сообщение 12.10.2007, 11:16
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Триграфы (trigraphs) это последовательности из трех символов ( из них два первых символа это знаки вопроса ) которые компилятор заменяет на соответствующие символы.

??= #
??( [
??/ \
??) ]
??’ ^
??< {
??! |
??> }
??- ~


Например результат выполнения следующего кода может быть не совсем таким, как ожидалось (в зависимости от компилятора):
printf( "Hello world??!\n" );

на консоли:
Hello world|

Для того, чтобы все стало хорошо код нужно подправить следующим образом:
printf( "Hello world?\?!\n" );

И для сомневающихся предлагается такая программка (все собирается и работает):

??=include <iostream>
using namespace std;

int main()
??<
cout << "??/nHello World??/n" << endl;
return 0;
??>


По умолчанию триграфы отключены в GCC, параметр для включения: -ansi -trigraph

Andrew Selivanov (at) gmail.com для crossplatform.ru
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.10.2007, 11:24
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Мда, век живи, век учись, не знал об этом... :)

А какая смысловая нагрузка в них непонятно!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 12.10.2007, 11:34
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(ViGOur @ 12.10.2007, 12:24) *
Мда, век живи, век учись, не знал об этом... :)

А какая смысловая нагрузка в них непонятно!


Вот перестанет работать что-нибудь из за такой фигни, будешь неделю втыкать в чем проблема :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
deninok
  опции профиля:
сообщение 28.12.2007, 23:42
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 28.12.2007
Пользователь №: 58

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur)
А какая смысловая нагрузка в них непонятно!

Смысловая нагрузка такая, что на клавиатуре пользователя может не быть некоторых привычных для нас символов. Конечно, для подавляющего большинства пользователей триграфы совершенно не нужны...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
deninok
  опции профиля:
сообщение 28.12.2007, 23:49
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 28.12.2007
Пользователь №: 58

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Andrew Selivanov)
Вот перестанет работать что-нибудь из за такой фигни, будешь неделю втыкать в чем проблема :D

О да, это уж точно! Могут возникнуть очень серьезные проблемы. Пример:

...
int main()
{
    ...
    if ( i < 3 ) {
        i = 3;         //????????????/
        int b = 10;    // А это очень важное действие!
    }
}


Так вот, в этом совершенно простом коде некое очень важное действие с переменной b НЕ произойдет! Почему, спросите вы? Обратите внимание на три последних знака в первом комментарии (в котором нам почему-то понадобилось указать много знаков вопроса): "??/" Эти три знака образуют триграф, который преобразуется к знаку "\", соединяющий строки (конкатенация)! Таким образом, комментарий с вопросительными знаками будет объединен со строкой, в которой должно произойти очень важное действие. И важная строка будет также закомментированной. Я проверял на компиляторе g++, это действительно так!
Причем ваш редактор (который, скорее всего, показывает закомментированный текст определенным цветом) в данной ситуации НЕ покажет строку с очень важным действием как закомментаренную. И компилятор не ругнется. Впрочем, это относится не ко всем компиляторам, но g++ точно не ругнется, ибо он не просматривает содержимое комментариев, считая это бесполезным. Но в приведенном мною примере такой подход приведет к ошибке.
Совет один: не допускайте триграфов в комментариях. Да и вообще избегайте их.

Сообщение отредактировал deninok - 28.12.2007, 23:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 29.12.2007, 10:05
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Мда, а потом попробуй найди из-за чего у тебя этот код не работает, сума сойдешь!!! :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
terrible
  опции профиля:
сообщение 4.1.2008, 15:02
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 16.10.2007
Пользователь №: 13

Спасибо сказали: 1 раз(а)




Репутация:   0  


Значит не стоит включать их поддержку, чтобы небыло таких проблем! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.1.2008, 20:26
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


А ведь важное замечание у deninok, в голову бы не пришло, хотя про триграфы читал, еще у Ричи.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rich
  опции профиля:
сообщение 14.3.2008, 22:00
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 123
Регистрация: 1.3.2008
Пользователь №: 109

Спасибо сказали: 6 раз(а)




Репутация:   0  


Цитата(terrible @ 4.1.2008, 15:02) *
Значит не стоит включать их поддержку, чтобы небыло таких проблем! :)

А как её выключить, если по умолчанию включено???/
ворнинги читать надо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 9:19