Как мне избавиться от этих предупреждений? - PullRequest
1 голос
/ 22 апреля 2010

Это действительно несколько вопросов, но все равно ...

Я работаю с большим проектом в XCode, относительно недавно перенесенным из MetroWorks (да, действительно), и есть куча предупреждений, от которых я хочу избавиться. Время от времени появляются важные предупреждения, но я никогда не смотрю на них, потому что их слишком много. Так что, если я смогу выяснить, как заставить XCode перестать выдавать предупреждение, или на самом деле решить проблему, это было бы здорово. Вот предупреждения:

  • Он утверждает, что <map.h> устарел. Однако, когда я заменяю его на <map> мои файлы не компилируются Очевидно, в map.h есть что-то, чего нет на карте ...
  • эта десятичная константа без знака только в ISO C90
    Это большое число по сравнению с неподписанным длинным. Я даже произнес это без эффекта.
  • несовпадение в условном выражении: <anonymous enum> против <anonymous enum>
    Похоже, что это от оператора?:. Возможно, что ветви then и else не соответствуют одному и тому же типу? За исключением того, что по крайней мере в одном случае это (matchVp == NULL ? noErr : dupFNErr)

    И так как они оба имеют тип OSErr, который определен для Mac ... Я не уверен, что случилось. Похоже, он появляется, когда у меня есть другие пары констант mac ...

  • константа из нескольких символов

    Это очевидно. Проблема в том, что мне на самом деле нужны многосимвольные константы ...

  • -записываемые строки не совместимы с литеральным CF / NSString

    Я снял флажок «Строки доступны только для чтения» как в настройках проекта, так и в настройках цели ... и, похоже, это не имело никакого эффекта ...

Ответы [ 4 ]

3 голосов
/ 22 апреля 2010

Элементы в <map.h> находятся в глобальном пространстве имен, в то время как элементы в <map> находятся в пространстве имен std. Скорее всего, вы просто обращались непосредственно к глобальным версиям, и когда вы переключились на <map>, вы больше не видели их, потому что они перешли на std::. В исходных файлах добавьте using namespace std, чтобы быстро двигаться дальше. В заголовках вы должны квалифицировать использование связанных с картой предметов с помощью std::.

Я думаю, вам нужно будет квалифицировать значение константы литерала с помощью конечного UL, чтобы он знал правильный тип литерала.

Скорее всего, перечисления находятся в двух отдельных ОС, определенных анонимных перечислений. Вы можете static_cast их, чтобы отключить предупреждение.

Нет представления о многобайтовых символах.

Можете ли вы отключить -fwritable-строки? Можете ли вы провести рефакторинг кода, который должен изменять константные строки?

3 голосов
/ 22 апреля 2010

«многосимвольная символьная константа»
Это очевидно. Проблема в том, что мне на самом деле нужны многосимвольные константы ...

Скомпилируйте с -Wno-multichar - добавьте его в «Другие флаги предупреждений» и оставьте предупреждение «Четыре символьных литерала» выключенным.

Конечно, многозначные константы этого унаследованного кода на самом деле означают то же самое, что они делали в Metrowerks, вероятно, в другой архитектуре ... это открытый вопрос.

1 голос
/ 22 апреля 2010

Эта десятичная константа записывается как 3111222333UL?

0 голосов
/ 07 октября 2010

Я обнаружил, что, по крайней мере, начиная с Xcode 3.2.4, вы можете убрать предупреждение, используя количество символов в константе, которая является правильной длиной для типа.

Например, у меня была константа длиной всего 3 символа 'TT2', и она давала мне ошибку из многосимвольной константы. Добавление 0 к константе привело к исчезновению ошибок, например: '\ 0TT2'.

...