Вставка токена(##) в строку
Возник такой вопрос: как вставить с помощью #define какое-либо имя, название и т.п. в строчку, т.е.
#include <iostream>
#define GREETING(Name) std::cout << "Hi, Name##!";
int main() {
GREETING(Nick);
return 0;
}
Хотелось бы чтобы после компиляции программа выводила "Hi, Nick!", но она выведет "Hi, Name##!". Как вывести строчку нормально с define?
Ответы (3 шт):
Автор решения: moskalenco_a
→ Ссылка
#include <iostream>
#define GREETING(Name) std::cout << "Hi, " << #Name << "!\n";
int main() {
GREETING(Nick);
return 0;
}
Автор решения: user7860670
→ Ссылка
## служит для склейки токенов, однако она тут не нужна, так как строковые литералы склеиваются сами, достаточно только преобразовать аргумент макроса в литерал посредством #
#include <iostream>
#define GREETING(Name) std::cout << "Hi, " #Name "!";
int main() {
GREETING(Nick);
return 0;
}
Автор решения: DmitryK
→ Ссылка
Макросы - ещё одна возможность выстрелить себе в ногу!
Проще и правильней с помощью функций. Компилятор при оптимизации скорее всего её заинлайнит:
#include <iostream>
void Greeting(const char* Name) { std::cout << "Hi, " << Name << "!";}
int main()
{
Greeting("Nick");
return 0;
}