Макро, который печатает выражение и оценивает его (с __string)
-
22-08-2019 - |
Вопрос
Для обучения и демонстрации мне нужен макрос, который печатает свой параметр а также оценивает это. Я подозреваю, что это очень распространенный случай, может быть даже FAQ, но я не могу найти реальные ссылки.
Мой текущий код:
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", __STRING(expr), (expr)))
а потом:
PRINT(x & 0x01);
Это работает нормально, но я не уверен в юридическом статусе __string макрос, особенно с тех пор, как он находится в частном пространстве __ имен.
Итак, мои вопросы:
- Есть ли лучший способ написать этот макрос?
- __String Standard/Great/Evil?
- Как использовать существующие инструменты поиска, чтобы найти __string? Итак, поисковая система просто ищет все, что содержит строку :-(
Решение
Вы можете использовать токен препроцессора #, который преобразует свой аргумент 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 Кажется, работает нормально.
Другие советы
Что-то типа
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", #expr, (expr)))
Вероятно, вы хотите. # оператор строки.