Gromacs源码收获(一)

         最近在看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比较复杂,这里简化了下。

你可能感兴趣的:(C++,Gromacs源码)