#c #c #gcc #g
#c #c #gcc #g
Вопрос:
Я компилирую устаревший код, используя компилятор gcc 4.8.5 на RHEL7. Все файлы C и C имеют «-unsigned» в качестве одного из флагов по умолчанию как для компиляции gcc, так и для компиляции g . Компилятор принимает эту опцию и успешно компилируется. Однако я не могу найти никакой документации по этой опции нигде ни в руководстве gcc, ни в Интернете. Кто-нибудь знает, что это за опция? Я должен перенести код и не понимаю, нужно ли переносить эту опцию компилятора или нет.
Комментарии:
1. Когда вы говорите legacy, как legacy? Мы могли бы начать разделять пополам старые руководства, если бы вы знали, для какого компилятора он был изначально написан. Имейте в виду, самая ранняя версия GCC, для которой я могу найти документы, — 2.95.3, и
-unsigned
в ней тоже нет.2. насколько мне известно, GCC позволяет добавлять параметры командной строки с использованием файлов спецификаций . Вы можете попробовать и посмотреть, используют ли они пользовательские файлы спецификаций
Ответ №1:
Я подозреваю, что это была просто ошибка в Makefile или что-то еще, что используется для компиляции кода.
gcc не поддерживает -unsigned
опцию. Однако он передает параметры компоновщику, и у GNU ld есть -u
опция:
‘-u SYMBOL’
‘—undefined=SYMBOL’
Принудительно вводит СИМВОЛ в выходной файл как неопределенный символ. Это может, например, вызвать связывание дополнительных модулей из стандартных библиотек. ‘-u’ может повторяться с разными аргументами опции для ввода дополнительных неопределенных символов. Эта опция эквивалентна команде скрипта компоновщика ‘EXTERN’.
Пробел между -u
и именем символа не является обязательным.
Таким образом, целью могло быть что-то сделать с неподписанными типами, но эффект, по крайней мере, с современными версиями gcc, заключается в вводе nsigned
в выходной файл в виде неопределенного символа.
Похоже, это не повлияло на быстрый тест, который я провел (скомпилировал и запустил небольшую программу «привет, мир»). Программа работает правильно, и вывод nm hello
включает:
U nsigned
С более старой версией gcc (2.95.2) в другой системе я получаю фатальную ошибку времени соединения с неопределенным символом.
Комментарии:
1. У вас есть рабочий gcc 2.95? 0. o Хорошая находка! 🙂
2. @BaummitAugen: на SPARC под управлением Solaris 9. (Не мой, просто система, к которой у меня есть доступ.)
Ответ №2:
Я подозреваю, что цель состоит в том, чтобы программа была скомпилирована -funsigned-char
. Я не знаю, было ли это раньше -unsigned
, во времена динозавров, и, возможно, GCC все еще учитывает это написание; из руководства невозможно узнать, потому что, если это так, это недокументированная функция.
Я бы попросил первоначального автора о намерении здесь, поскольку они не сочли нужным документировать.
Комментарии:
1. По-видимому, нет или, по крайней мере, так больше не работает. melpon.org/wandbox/permlink/XXTmWrJ6ggmQa01h против melpon.org/wandbox/permlink/S8E1jAFnmDOb4ssR
2. @BaummitAugen: В стороне, что ниже
0
? o.O3. Я полагаю, что возвращаемое значение gcc. Это происходит
1
при сбое компиляции.4. @BaummitAugen: Понял. Вау, это сбивает с толку.
5. gcc действительно принимает
-unsigned
, но не как опция компилятора. Смотрите мой ответ.