Сделайте наоборот.
#define PRINT_PTR(p) printf(#p " == %p\n", (void *) p)
int main()
{
PRINT_PTR(exit);
return 0;
}
Внутри макроса, если x
является аргументом макроса, тогда #x
является строковой версией.
#define PRINT_INT(i) printf(#i " == %d\n", i)
PRINT_INT(5 + ~3);
PRINT_INT(atoi("1234"));
Как правило, если вы используете это много, то вы захотите определить вспомогательную функцию для обхода системы слабого типа в C:
void print_ptr_func(char const *s, int v);
#define PRINT_PTR(p) print_ptr_func(#p, p)
Обратите внимание, что этоне будет работать для получения адреса текущей функции.__FUNC__
не является макросом и не является строковым литералом, в нем нет двойных кавычек.Вы не можете использовать __FUNC__
, чтобы получить адрес функции без какого-либо серьезного обмана, и он сломается в половине случаев.Например:
#define PRINT_FUNC_INFO() print_func_info(__FUNC__)
#include <dlfcn.h>
void print_func_info(char const *n)
{
void *p = dlsym(RTLD_DEFAULT, n);
printf("Function %s, address %p\n", n, p);
}
Однако это не будет работать половину времени - dlsym
не был предназначен для этой цели.