我以前做过这个,但不知道我现在不能这样做,所以我在这里问。 我有一些我从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 ++)
答案 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
以外的东西而不是宏)。