Вставка токена(##) в строку

Возник такой вопрос: как вставить с помощью #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;
}
→ Ссылка