使用C中的define在所有特定函数调用之后或之前添加语句

时间:2017-05-17 14:03:00

标签: c c-preprocessor

我以前做过这个,但不知道我现在不能这样做,所以我在这里问。 我有一些我从git存储库下载的代码,我想打印文件名,并在调用malloc时使用linenumber。我做了一个简单的测试。

---- test.c ----
#include <stdlib.h>
#include <stdio.h>
#include "xxx.h"

main()
{
printf("hello\n");
int *ip = malloc(120*sizeof(int));
printf("ip = %x\n",ip);
free(ip);
}

---- xxx.h
#define malloc(x) do {malloc(x); \
printf("malloc at %s()-%d,%s\n",__func__,__LINE__,__FILE__);} \
while(0)

当我gcc test.c时,我得到了

test.c: In function 'main':
test.c:8: error: expected expression before 'do'

我该如何修复xxx.h? (这个问题也适用于C ++)

2 个答案:

答案 0 :(得分:4)

试试这个:

#define malloc(x) ( \
    printf("malloc at %s()-%d,%s\n",__func__,__LINE__,__FILE__), \
    malloc(x))

这个想法是使用这样的“逗号运算符”:

int *ip = (printf(...), malloc(120*sizeof(int)));

逗号运算符的结果始终是它的最后一个参数。

答案 1 :(得分:0)

给定宏,行

int *ip = malloc(120*sizeof(int));

扩展为

int *ip = do { malloc(120*sizeof(int)); printf("malloc at %s()-%d,%s\n",__func__,__LINE__,__FILE__);} while(0);

希望能够明确错误的来源。

John Zwinck的解决方案是一个不错的选择,虽然我亲自创建了一个包装函数(自然地命名为malloc以外的东西而不是宏)。