#c #gcc
#c #gcc
Вопрос:
Это простой пример, который может помочь мне вывести malloc
значение параметров
void *__wrap_malloc(size_t size)
{
printf("My malloc function!n");
return __real_malloc(size);
}
Но я хочу использовать в методе класса, например
class A{
public:
void test(int a)
{
printf("%d", a):
}
}
Это использование типа выдает ошибку.
void A::__wrap_test(int a)
{
printf("wrap");
return A::test()
}
Может кто-нибудь сказать мне, как правильно его использовать?
Комментарии:
1. Я думаю, это помогло бы: en.wikipedia.org/wiki/Curiously_recurring_template_pattern
2. Изучите
extern C
Ответ №1:
как правильно его использовать?
Чтобы использовать вообще, сначала у вас должен быть символ. Итак, сначала сделайте определение встроенной функции нестроевым, чтобы для него можно было сгенерировать символ. Затем вам нужно найти искаженное имя символа. Итак, сначала исправьте свои опечатки и скомпилируйте библиотеку в объектный файл:
// a.hpp
class A {
public:
void test(int a);
};
// a.cpp
#include <stdio.h>
#include "a.hpp"
void A::test(int a) {
printf("%dn", a);
}
После компиляции проверьте сгенерированное искаженное имя символа:
$ g -c a.cpp amp;amp; nm a.o
U _GLOBAL_OFFSET_TABLE_
0000000000000000 T _ZN1A4testEi
U printf
Итак, здесь вы можете, наконец, получить имя символа для переноса : _ZN1A4testEi
. Затем вы можете создать обработчик с оболочкой.
Я предполагаю, что, скорее всего, неверно, что первым аргументом функции-члена будет указатель на класс — я не проводил исследований по этой теме, и я не знаю, правда ли это. После получения имени символа мы можем написать основную программу:
// main.cpp
#include "a.hpp"
extern "C" {
void __real__ZN1A4testEi(A *t, int a);
void __wrap__ZN1A4testEi(A *t, int a) {
printf("wrap ");
return __real__ZN1A4testEi(t, a);
}
};
int main() {
A().test(5);
}
и компилировать и запускать с:
$ g -c -o a.o a.cpp
$ g -c -o main.o main.cpp
$ g -Wl,--wrap=_ZN1A4testEi a.o main.o -o main.out
$ ./main.out
wrap 5