2010-04-22 2 views
1

Это действительно несколько вопросов, но все равно ...Как я могу избавиться от этих предупреждений?

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

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

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

  • мульти-символьный характер постоянной

    Это один очевидна. Проблема заключается в том, что я на самом деле НУЖНА константы из нескольких символов ...

  • -fwritable-строки не совместим с буквальным CF/NSString

    Я беспрепятственно «Строки Read-Only» окно как в проекте и целевые параметры ... и, похоже, не имели никакого эффекта ...

+0

Некоторые части вашего вопроса, кажется, отсутствуют. Например. «Он утверждает, что устарел». Что? Заменить что с чем? – ndim

+2

Нет, не «но все равно». Если у вас есть несколько вопросов, пожалуйста, просто отправьте несколько вопросов. Это позволяет более точно отвечать на вопросы, и это позволяет заголовок вопроса быть более значимым и, следовательно, легче для других найти позже. –

+0

Что сказал @Rob. Задавайте каждый вопрос отдельно, чтобы другие могли найти их и получить ответы на них. – jalf

ответ

3

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

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

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

Не знаю, как многобайтовые символы.

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

+0

Мне нужны перезаписываемые строки в основном потому, что альтернатива должна пройти и сделать много символов char * в const char * ... Я займусь этим на этот день ... –

1

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

+1

Еще лучше: UINT32_C (3111222333) – nall

+0

@nall: Спасибо, что упомянули об этом. Я не знал об этом, но это имеет большой смысл. Будет использовать его с этого момента. – ndim

3

"многосимвольный характерный символ"
Это очевидно. Проблема заключается в том, что я на самом деле НУЖНА константе из нескольких символов ...

Compile с -Wno-multichar - добавьте его в другие флаги предупреждения, и оставьте предупреждение литералов Четыре персонажа выключено.

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

+0

Многосимвольные константы для MacOS (pre-MacOSX), как правило, просто вставляют символы в массив, поэтому '' dht1'' будет похож на 'char foo [4] = {'d', 'h', 't', '1'} ; ', поэтому они будут полезны для метаданных файлов MacOS. Я не знаю, как gcc в XCode обрабатывает многочленные константы, но файловая структура MacOSX является прямой Unix и не использует четырехсимвольные идентификаторы файлов и приложений. –

+0

@ Давид: Нет. Эти компиляторы интерпретировали их как целые числа «подходящего» размера в «очевидном» способе, оставляя вас открытым для возбуждения энтузиазма. На разумном хостинге большой точки макет в памяти будет таким же, как ваш массив; в современном режиме «все-мир-Intel», не так много. // Ваша точка зрения о том, что MacOSX не использует многосимвольные символьные константы, если это вообще правильно, но OP не говорит, что он использует их для ... –

+0

Аудитория энтузиазма на самом деле не произошла, поскольку MacOS был мертв к тому времени, когда Apple переехала в Intel, а 68000 и PPC были оба (если я не помню, как ошибаюсь) big-endian. Это было очень необходимо для всех компиляторов Mac сделать то же самое, очевидное или нет. Я не знаю, для чего их использовал OP, но метаданные файлов были, безусловно, самыми большими. –

0

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

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

Смежные вопросы