最近在看Gromacs的源码,万恶的毕设。对于分子动力学的小白来说,做这个真心是一个巨大的挑战啊。但是通过看代码还是能学到些东西的,聊以慰藉。今天看到一个snew宏,死活不懂为什么宏后面的参数前有一个#号,做一个小实验试了下,原来可以得到变量名。
#define _CRT_SECURE_NO_DEPRECATE #include <iostream> using namespace std; #define snew(ptr, nelem) _snew(#ptr, __FILE__, __LINE__, (ptr), (nelem), sizeof(*(ptr))) void *save_calloc(const char *name, const char *file, int line, size_t nelem, size_t elsize) { void *p; p = NULL; if ((nelem == 0) || (elsize == 0)) { p = NULL; } else { /* emulate calloc(3) with malloc/memset on machines with a broken calloc, e.g. in -lgmalloc on cray xt3. */ if ((p = malloc((size_t)nelem*(size_t)elsize)) == NULL) { //err message } memset(p, 0, (size_t)(nelem * elsize)); } return p; } template <typename T> void _snew(const char *name, const char *file, int line, T * &ptr, size_t nelem, size_t elsize) { ptr = (T *)save_calloc(name, file, line, nelem, elsize); } int main() { int a = 1, b = 2; char *p = NULL; snew(p, 10); strcpy(p, "Hello"); system("pause"); return 0; }经过一番实际测试和查找,发现,在宏中可以通过#号获取ptr的原始变量名称。这样就最大程度上定位内存申请所在的位置和变量。源代码中的save_calloc比较复杂,这里简化了下。