Макрос для удаления двойных кавычек в c - PullRequest
0 голосов
/ 19 сентября 2011

Есть ли макрос, который удаляет двойные кавычки и '\ 0' в строке?

Например: - "HELLO \ 0" -> HELLO

Отредактировано: - На самом деле яхочу получить адрес функции.Поэтому я подумал использовать макрос FUNC для получения имени функции и выделения двойных кавычек, а '\ 0' поможет мне получить адрес функции.

для примера:

#define FUN_PTR fun
#define FUN_NAME "fun"
void fun(){
 printf("fun add %p name %s\n",FUN_PTR,FUN_NAME);
}

Чтобы пользователь не определял макросы.Мне нравится знать другие методы для получения этих функций:).

void fun(){
 printf("fun add %p name %s\n",<SOME_MACRO>(__FUNC__),__FUNC__);
}

1 Ответ

4 голосов
/ 19 сентября 2011

Сделайте наоборот.

#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 не был предназначен для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...