Макрос, который печатает выражение и оценивает его (с __STRING) - PullRequest
6 голосов
/ 18 декабря 2008

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

Мой текущий код:

#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", __STRING(expr), (expr)))

и затем:

PRINT(x & 0x01);

Работает нормально, но я не уверен в юридическом статусе макроса __STRING, тем более что он находится в закрытом пространстве имен __.

Итак, мои вопросы:

  1. Есть ли лучший способ написать этот макрос?
  2. Является ли __STRING стандартом / великим / злом?
  3. Как использовать существующие инструменты поиска, чтобы узнать о __STRING? Поисковая система SO просто ищет что-либо, содержащее строку: - (

Ответы [ 2 ]

12 голосов
/ 18 декабря 2008

Что-то вроде

#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", #expr, (expr)))

это, вероятно, то, что вы хотите. # является оператором строкового преобразования.

10 голосов
/ 18 декабря 2008

Вы можете использовать токен препроцессора #, который преобразует свой аргумент RHS в строковый литерал:

#include <stdlib.h>
#include <stdio.h>

#define STR(x) #x
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", STR(expr), (expr)))

int main(void)
{
    int x = 7;

    PRINT(x & 0x01);

    return EXIT_SUCCESS;
}

2) Это определенно не стандартно, и я впервые сталкиваюсь с этим; это неудивительно, поскольку на первый взгляд кажется, что он не выполняет намного больше, чем макрос STR (), приведенный выше.

3) Google вроде бы нормально работает.

...