Операторы #define в пространстве имен

Я вижу, что у некоторых людей возникают проблемы с использованием метода UITapGestureRecognizer. Самый простой способ, которым я выполнил эту функцию, при этом оставляя неизменным поведение нажатия моей существующей кнопки, это добавление только одной строки к ответу @ Jensen2k:

[tap setCancelsTouchesInView:NO];

Это позволило моим существующим кнопкам по-прежнему работать без использования @ Метод Дмитрия Ситникова.

Читайте об этом property здесь (ищите CancelsTouchesInView): Справочник по классам UIGestureRecognizer

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

50
задан Soo Wei Tan 6 July 2009 в 06:40
поделиться

5 ответов

Верно, #define не связаны пространствами имен. #define - это директива препроцессора - она ​​приводит к манипулированию исходным файлом перед компиляцией через компилятор. Пространства имен используются на этапе компиляции, и компилятор не понимает #define .

Вам следует по возможности избегать использования препроцессора. Для таких постоянных значений лучше использовать const вместо #define .

65
ответ дан 7 November 2019 в 10:54
поделиться

Я полностью согласен с предложениями об использовании констант и неограниченной области действия для #define s.

Однако, если вы сделаете ] должны использовать строки препроцессора #define , пожалуйста, закройте их правильно для ожидаемой области,

namespace MyNamespace
{
  #define SOME_VALUE 0xDEADBABE
  // your code
  #undef SOME_VALUE
}

Почему #defines ?
Я знаю один случай, когда встроенная платформа не поддерживала константы в коде.
Не было возможности их инициализировать ...
Это всегда помогает сделать его более читабельным.

21
ответ дан 7 November 2019 в 10:54
поделиться

Препроцессор работает (по крайней мере, концептуально, а часто и фактически тоже) до того, как «сработают» пространства имен и другие концепции уровня языка - так что да, это определенно много лучше использовать конструкции уровня языка, такие как const значения везде, где это возможно!

4
ответ дан 7 November 2019 в 10:54
поделиться

Если по какой-то причине вы не можете перейти ко второму случаю, я почти уверен, что вам придется позаботиться о том, чтобы скомпилировать MyNamespace в отдельный объект и связать объекты отдельно ( или, возможно, просто запустите препроцессор в этом единственном пространстве имен). Препроцессор C ++ должен взять этот оператор #define и, по сути, выполнить замену строки в любом месте , которое SOME_VALUE замечено в исходном коде. Следовательно, если препроцессор не знает #define , НЕКОТОРЫЕ_ЗНАЧЕНИЕ не может быть заменено в другом исходном файле.

1
ответ дан 7 November 2019 в 10:54
поделиться

Да. В общем, использование значений const вместо значений #define'd имеет много преимуществ. Ограничение области действия переменной - одно из преимуществ. Таким образом, область видимости может быть ограничена пространством имен или любой другой допустимой областью (в том числе на уровне класса, на уровне функции и т. Д.).

3
ответ дан 7 November 2019 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: