Макрос на языке Си (#define) - PullRequest
4 голосов
/ 22 мая 2010

Я читаю исходный код распределителя памяти, и в файле gnuwrapper.cpp есть следующий код

#define CUSTOM_MALLOC(x)     CUSTOM_PREFIX(malloc)(x)  

В чем смысл CUSTOM_PREFIX(malloc)(x)? CUSTOM_PREFIX это функция? Но как функция это нигде не определено. Если это переменная, то как мы можем использовать переменную типа var(malloc)(x)?

Еще код:

#ifndef __GNUC__
#error "This file requires the GNU compiler."
#endif

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>


#ifndef CUSTOM_PREFIX   ==> here looks like it's a variable, so if it doesn't define, then define here.
#define CUSTOM_PREFIX
#endif

#define CUSTOM_MALLOC(x)     CUSTOM_PREFIX(malloc)(x)    ===> what's the meaning of this?
#define CUSTOM_FREE(x)       CUSTOM_PREFIX(free)(x)
#define CUSTOM_REALLOC(x,y)  CUSTOM_PREFIX(realloc)(x,y)
#define CUSTOM_MEMALIGN(x,y) CUSTOM_PREFIX(memalign)(x,y)

Ответы [ 3 ]

6 голосов
/ 22 мая 2010

В вашем коде, поскольку CUSTOM_PREFIX определено как ничто, строка CUSTOM_PREFIX(malloc)(x) будет расширена до

(malloc)(x)

что эквивалентно обычному

malloc(x)

Однако CUSTOM_PREFIX позволяет разработчику выбирать другую функцию управления памятью. Например, если мы определим

#define CUSTOM_PREFIX(f) my_##f

, тогда CUSTOM_PREFIX(malloc)(x) будет расширен до

my_malloc(x)
0 голосов
/ 22 мая 2010

По предположению, это макрос, который изменяет вызовы malloc (x) и т. Д. На что-то вроде:

DEBUG_malloc( x );

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

0 голосов
/ 22 мая 2010

CUSTOM_PREFIX определено как ничто, поэтому оно просто исчезнет, ​​оставив после себя (malloc)(x), что соответствует malloc(x). Зачем? Я не знаю. Возможно, в других местах кода установлено CUSTOM_PREFIX на что-то другое.

...