Для чего предназначена опция компилятора gcc «-unsigned»?

#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.O

3. Я полагаю, что возвращаемое значение gcc. Это происходит 1 при сбое компиляции.

4. @BaummitAugen: Понял. Вау, это сбивает с толку.

5. gcc действительно принимает -unsigned , но не как опция компилятора. Смотрите мой ответ.