C编程malloc宏问题

时间:2012-03-30 07:02:59

标签: c macros malloc

使用Microsoft Visual Studio 2010:

我可以在C中编写这种类型的宏吗?我自己无法工作。

#define MEM_ALLOC_C(type, nElements) (type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))

如果我这样写,它就有效:

#define MEM_ALLOC(type, nElements) (testFloat = (float*)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT))

这就是我使用它的方式:

#define CACHE_ALIGNMENT 16
#define INDEX 7
#define MEM_ALLOC(type, nElements) (type = (float*)_aligned_malloc(nElements * sizeof(float), CACHE_ALIGNMENT))
#define MEM_ALLOC_C(type, nElements) (type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))
#define MEM_DEALLOC_PTR(type) (_aligned_free(type))

int _tmain(int argc, _TCHAR* argv[])
{
    float* testFloat;

    //MEM_ALLOC_C(testFloat, INDEX);    // Problem here.

    MEM_ALLOC(testFloat, INDEX);        // works

    //testFloat = (float*)_aligned_malloc(INDEX * sizeof(float), CACHE_ALIGNMENT);  // works

    testFloat[0] = (float)12;

    //MEM_DEALLOC_PTR(testFloat);       // If we call de-alloc before printing, the value is not 12.
                                    // De-alloc seems to work?

    printf("Value at [%d] = %f \n", 0, testFloat[0]);

    getchar();

    MEM_DEALLOC_PTR(testFloat);

return 0;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

考虑一下替换:

type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT)

成为

testFloat = (testFloat*)_aligned_malloc(INDEX * sizeof(testFloat), CACHE_ALIGNMENT)

没有testFloat*这样的东西。

在纯C中,不需要转换malloc的结果。因此,您可以这样做:

#define MEM_ALLOC_C(var, nElements) (var = _aligned_malloc(nElements * sizeof(*var), CACHE_ALIGNMENT))

答案 1 :(得分:1)

MEM_ALLOC_C()宏中的问题是您使用type参数作为类型和左值。那是行不通的:

#define MEM_ALLOC_C(type, nElements) (type = (type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))
//                                    ^^^^    ^^^^                                     ^^^^
//                                   lvalue   type                                     type

请注意,在您的工作版本中,您必须使用左值所在的变量名称和其他位置的类型。

如果你真的想拥有这样的宏,为什么不像函数一样使用它并将结果赋值给指针而不是将赋值隐藏在宏中:

#define MEM_ALLOC_C(type, nElements) ((type*)_aligned_malloc(nElements * sizeof(type), CACHE_ALIGNMENT))

testFloat = MEM_ALLOC_C(float, INDEX);