Как препроцессор C ++ можно использовать со строками? - PullRequest
3 голосов
/ 23 января 2012

Препроцессор можно использовать для замены некоторых ключевых слов другими словами, используя #define. Например, я мог бы сделать #define name "George", и каждый раз, когда препроцессор находит «имя» в программе, он заменяет его на «Джордж».

Однако, похоже, это работает только с кодом. Как я мог сделать это со строками и текстом? Например, если я печатаю «Здравствуйте, меня зовут» на экран, я хочу, чтобы «имя» было заменено на «Джордж», даже если оно в строке, а не в коде.

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

Возможно ли это? Если так, то как?

Я использую C ++, но решения C также приемлемы.

Ответы [ 3 ]

15 голосов
/ 23 января 2012
#define name "George"

printf("Hello I am " name "\n");

Смежные строковые литералы объединяются в C и C ++.

Цитаты из C и C ++ Стандарт:

Для C (цитирование C99, но C11 имеет нечто подобное в 6.4.5p5):

(C99, 6.4.5p5) "На этапе 6 трансляции последовательности многобайтовых символов, заданные любой последовательностью смежных символов и одинаковыми префиксами строковых литеральных токенов, объединяются в одну последовательность многобайтовых символов."

Для C ++:

(C ++ 11, 2.14.5p13) «На этапе перевода 6 (2.2) смежные строковые литералы объединяются».

РЕДАКТИРОВАТЬ: по запросу добавьте кавычки из C и C ++ Standard. Спасибо @MatteoItalia за цитату из C ++ 11.

7 голосов
/ 23 января 2012
#define name "George"

printf("Hello I am %s\n", name); 

Здесь имя будет заменено на "Георгий"

3 голосов
/ 23 января 2012

Ваша проблема в том, что препроцессор (мудро) не заменит токены, которые внутри строковых литералов .

Так что вы должны либо использовать функцию типа printf, либо переменную вместопрепроцессор, или вытащите токен из строки так:

#include <iostream>

#define name "George"

int main(int argc, char** argv) {
    std::cout << "Hello I am " << name << std::endl;
}
...