Выход из # символа в #define макросе?

По состоянию на Swift 4

Это просто:

test1.count

по причинам.

(Благодаря Martin R)

По состоянию на Swift 2:

С Swift 2 Apple изменила глобальные функции на расширения протокола, расширения, которые соответствуют любому типу в соответствии с протоколом. Таким образом, новый синтаксис выглядит следующим образом:

test1.characters.count

(Спасибо JohnDifool за заголовки)

Начиная со Swift 1

Используйте счетные символы Метод:

let unusualMenagerie = "Koala 🐨, Snail 🐌, Penguin 🐧, Dromedary 🐪"
println("unusualMenagerie has \(count(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

прямо из Руководства Apple Swift

(обратите внимание, что для версий Swift более ранних, чем 1.2, вместо этого будет countElements(unusualMenagerie))

для вашего переменная, это будет

length = count(test1) // was countElements in earlier versions of Swift

Или вы можете использовать test1.utf16count

37
задан ybungalobill 1 January 2017 в 19:40
поделиться

5 ответов

Насколько я помню, вы не можете использовать другую директиву препроцессора в define.

29
ответ дан 27 November 2019 в 04:11
поделиться

Проблема не в том, что на выходе препроцессора появляется символ #.

Очевидно, вы хотите, чтобы препроцессор повторно проанализировал ваш файл, чтобы иметь дело с вновь созданными директивами #include как частью расширения макроса. Так не работает. Если строка начинается с символа #, это интерпретируемая инструкция препроцессора. Если строка не начинается с символа #, она подлежит только преобразованию препроцессора, включая подстановку макросов. Этот тест выполняется один раз на строку.

MACRO(Test)

не начинается с символа #. Поэтому он не интерпретируется как директива препроцессора; вместо этого на него распространяются правила замены макросов.

28
ответ дан 27 November 2019 в 04:11
поделиться

Это потому, что # имеет особое значение при использовании в макросе.

#  means quote the following token (which should be a macro parameter name)
## means concatenate the preceding and following tokens.

В вашей ситуации за # нет правильного токена. Итак, в вашей ситуации нам нужно пройти уровень косвенного обращения:

#define     QUOTE(name)     #name
#define     TEST(name)      QUOTE(name ## foo)

#include TEST(scot)
11
ответ дан 27 November 2019 в 04:11
поделиться

Вы не можете этого сделать. Директивы препроцессора распознаются до раскрытия макроса; если макрос расширяется во что-то похожее на директиву препроцессора, эта директива не будет распознана. Лучшее, что вы можете сделать, - это создать макрос для имени файла:

#define MACRO(name) "name##foo"
...
#include MACRO(Test)
6
ответ дан 27 November 2019 в 04:11
поделиться

Этот может работать (он работает для обычных макросов #define без параметров, но я не тестировал его с макросами с параметрами).

#define MACRO(name) <name##foo>
#include MACRO(Test)
2
ответ дан 27 November 2019 в 04:11
поделиться