Як використовувати аргумент Macro як рядковий літерал?


91

Я намагаюся зрозуміти, як написати макрос, який передаватиме як функцію рядкового літерального подання імені змінної разом із самою змінною.

Наприклад, задана наступна функція.

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

Я хотів би написати макрос, щоб я міг зробити це:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

Що роздрукувало б: my_val: 5

Я спробував зробити наступне:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

Однак, як ви можете здогадатися, VAR всередині лапок не замінюється, а просто передається як строковий літерал "VAR". Тому я хотів би знати, чи є спосіб перетворити аргумент макросу на сам рядковий літерал.


Як ти намагаєшся цим користуватися?
Кріс

Відповіді:



29

Ви хочете використовувати оператор розтягування:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

Можливо, ви спробуєте таке рішення:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";

Як це відповідає на запитання чи чим воно корисне?
jirigracik

1
@jirigracik - Це також дозволяє отримати рядкову презентацію розширення макросів, на відміну від інших відповідей
grepcake

3
Думаю, було б корисно пояснити, чому простого QUDI(x)недостатньо.
LRDPRDX

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

Я не зовсім впевнений, але, схоже, "Hello" #x"#x "Hello") призводить до того, що рядок склеюється без місця, що в деяких випадках бажано, тому це досить гарна відповідь.
Smar

1
@Smar Не забудьте поставити пробіл після постійного рядка Привіт: "Hello " #x
jack

Гаразд, я так думав, ви також повинні відредагувати це на свою відповідь, оскільки це цінна інформація :)
Smar,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.