Может ли препроцессор C выполнять простые манипуляции со строками? - PullRequest
3 голосов
/ 09 апреля 2011

Это C вопрос о странности макросов.

Можно ли написать макрос, который принимает строковую константу X ("...") в качестве аргумента и вычисляет строковое значение Y такой же длины, чтобы каждый символ Y был [постоянным] арифметическим выражением соответствующего символа X.

Это невозможно, верно?

Ответы [ 2 ]

7 голосов
/ 09 апреля 2011

Нет, препроцессор C рассматривает строковые литералы как один токен, и поэтому он не может выполнять никаких подобных манипуляций.

То, что вы запрашиваете, должно быть сделано в реальном коде C.Если вы беспокоитесь о производительности во время выполнения и хотите делегировать эту фиксированную задачу во время компиляции, современные оптимизирующие компиляторы должны успешно работать с таким кодом - они могут развернуть любые циклы и предварительно вычислить любые фиксированные выражения, принимая при этом размер кода и использование кэша ЦП.шаблонов, о которых препроцессор понятия не имеет.

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

1 голос
/ 09 апреля 2011

Как уже говорили другие, препроцессор видит целые строки как токены. Существует только одно исключение - оператор _Pragma, который принимает строку в качестве аргумента и маркирует ее содержимое для передачи в директиву #pragma.

Так что, если вы не нацелились на _Pragma, единственный способ сделать что-то на этапах предварительной обработки - это записать их в виде последовательностей токенов, манипулировать ими и в конце их упорядочить.

...