Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2010, 13:40   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Разные компиляторы - разные результаты

Переводя учебник Programming Linux Games, я обкатывал исходник, где показывалось, как при помощи SDL работать с потоками.
SDL ориентирована на работу с языком Си, но у меня в планах писать программу с использованием некоторых средств C++.
При помощи компилятора gcc (программирую на Ubuntu Linux в терминале) следующие строчки:
Код:
SDL_Thread *thread1 = SDL_CreateThread(ThreadEntryPoint, "Thread1"),
SDL_Thread *thread2 = SDL_CreateThread(ThreadEntryPoint, "Thread2"),
SDL_Thread *thread3 = SDL_CreateThread(ThreadEntryPoint, "Thread3"),
компилируются без каких-либо проблем. ThreadEntryPoint - функция, написанная мной, точка входа потока. Вторым аргументом передаётся переменная void *, которую можно трансформировать во что угодно. Короче, кто программирует потоки, поймёт.

Соль в том, что при попытке компиляции этих строк при помощи g++ происходит ошибка
invalid conversion from 'const void*' to 'void*'
а вслед за ней, разумеется,
initializing argument 2 of 'SDL_Thread* SDL_CreateThread(int (*)(*void), void*)'

Проблема решается преобразованием типом в стиле Си - (void *):

Код:
SDL_Thread *thread1 = SDL_CreateThread(ThreadEntryPoint, (void *) "Thread1"),
Программа вроде бы как работает, как скомпилированная на gcc ранее.
И всё же мне любопытно - почему при смене компилятора происходит подобного рода ошибка? g++ по-другому обрабатывает данные?
И, несмотря на то, что решение найдено, повлияет ли смена компилятора на работу программы?
Кипящий чайник вне форума Ответить с цитированием
Старый 16.07.2010, 13:50   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Разные компиляторы по-разному смотрят на неоднозначные ситуации и имеют различную политику обработки ошибок. Некоторые могут не обратить внимание на неявное преобразование строки к void*, другие более строго к этому отнесутся и выдадут ошибку, заставив вас явно указать, что это не ваша опечатка, а вы действительно хотите сделать то, что делаете.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 16.07.2010, 14:19   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

"Thread1" - это const char *. Без проблем это может неявно преобразоваться только к const void *. Константу отбрасывать неявно неправильно. А иначе не был бы нужен const_cast, да и смысла в константах бы не было.
pu4koff вне форума Ответить с цитированием
Старый 16.07.2010, 14:54   #4
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

С const_cast всё работает как и прежде, с преобразованием (void *).
Ты хочешь сказать, что неявное преобразование может запутать программиста, и поэтому лучше пользоваться более явными методами?
Кипящий чайник вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разные шрифты в Memo das Ma:dchen Компоненты Delphi 1 29.05.2010 09:16
Разные формы, Дельфи grom333 Помощь студентам 9 15.01.2010 22:07
fontdialog на разные поля Михаил Юрьевич Общие вопросы Delphi 2 21.10.2009 14:32
сравнить разные строки Katovski Общие вопросы Delphi 8 02.05.2008 21:10
Поисковики ! всякие разные Virtson Софт 0 07.12.2007 19:18