El título casi lo dice todo, pero voy a replantear la pregunta ...¿El siguiente programa es un programa C99 estrictamente conforme?
¿El siguiente programa es un "programa estrictamente conforme" bajo el estándar C99?
#include <stdlib.h>
/* Removing any pre-existing macro definition, in case one should exist in the implementation.
* Seems to be allowed under 7.1.3 para 3, as malloc does not begin with _X where X is any capital letter.
* And 7.1.4 para 1 explicitly permits #undef of such macros.
*/
#ifdef malloc
#undef malloc
#endif
/* Macro substitution has no impact on the external name malloc
* which remains accessible, e.g., via "(malloc)(s)". Such use of
* macro substitution seems enabled by 7.1.4 para 1, but not specifically
* mentioned otherwise.
*/
void * journalling_malloc(size_t size);
#define malloc(s) ((journalling_malloc)(s))
int main(void)
{
return malloc(10) == NULL ? 1 : 0;
/* Just for the sake of expanding the
* macro one time, return as exit code
* whether the allocation was performed.
*/
}
BTW, soy consciente de que uno también querría 'envolver' gratis(), realloc(), strdup(), calloc() y quién sabe qué otra cosa. Esa no es la pregunta. En una nota al margen: ¿quién sabe qué más? Esas son todas las API malloc() que puedo conjurar desde lo más alto de mi cabeza. –
Solo quiero mencionar que este método no ayudará con el uso de malloc en ninguna biblioteca externa. Varias personas ofrecen implementaciones de malloc alternativas que se pueden agregar en el tiempo de enlace, por ejemplo, google en http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools – gnud