Вызов Мэллока из макроса оболочки - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь написать несколько макросов для отладки кода, над которым я работаю, но у меня возникла проблема, и я не уверен, как ее решить. Я хотел бы обернуть malloc другой функцией, а затем использовать макрос, чтобы заменить любые вызовы оболочкой. Проблема в том, что сама оболочка должна вызывать malloc. У меня есть такой файл заголовка:

memory.h:

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__ )
#define free(X) my_free( X )

void *my_malloc(size_t size, const char *file, int line, const char*func);
void my_free(void *ptr);

Тогда у меня есть связанный файл .c для определения функций оболочки.

memory.c:

#include "memory.h"
void *my_malloc(size_t size, const char *file, int line, const char*func) {
    void *ptr = malloc(size);
    /* do stuff */
    return ptr;
}

void my_free(void *ptr) {
    /* do stuff */
    free(ptr);
}

Наконец, у меня есть код, где я хочу, чтобы макросы работали.

main.c

int main(int argc, char **argv) {
    int *my_ptr = malloc( sizeof(int) );
    free(my_ptr);
    return 0;
}

Проблема, с которой я сталкиваюсь, заключается в том, что функция становится рекурсивной и вылетает из программы. У меня вопрос, есть ли способ, которым я могу отделить свою реализацию от моего заголовочного файла и при этом получить доступ к реальной функции malloc изнутри (то есть, чтобы .c-файл знал, что нужно вызывать правильный malloc вместо замены препроцессора? это)?

Заранее спасибо!

1 Ответ

0 голосов
/ 01 мая 2018

Способ сделать это - макросы #undef malloc и free в memory.c:

memory.c:

#undef malloc
#undef free

void *my_malloc(size_t size, const char *file, int line, const char*func)
{
    ...
}
...
void my_free(void *ptr)
{
    ...
}

Другой способ - объявить функции my_malloc и my_free как extern. Таким образом, memory.h, который содержит malloc и free, не следует включать в memory.c.

memory.c:

/* #include "memory.h" */

extern void *my_malloc(size_t size, const char *file, int line, const char*func)
{
    ...
}
...
extern void my_free(void *ptr)
{
    ...
}

memory.h

extern void *my_malloc(size_t size, const char *file, int line, const char*func);
...
extern void my_free(void *ptr);
...