这段代码中的错误检查有什么意义?

时间:2016-03-23 13:36:50

标签: c opencl

我正在查看clfft的示例代码。我注意到他们在每次函数调用后都会为err分配一个值。

err = clfftCreateDefaultPlan(&planHandle, ctx, dim, clLengths);

/* Set plan parameters. */
err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE);
err = clfftSetLayout(planHandle, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
err = clfftSetResultLocation(planHandle, CLFFT_INPLACE);

/* Bake the plan. */
err = clfftBakePlan(planHandle, 1, &queue, NULL, NULL);

/* Execute the plan. */
err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &queue, 0, NULL, NULL, &bufX, NULL, NULL);

/* Wait for calculations to be finished. */
err = clFinish(queue);

/* Fetch results of calculations. */
err = clEnqueueReadBuffer( queue, bufX, CL_TRUE, 0, N * 2 * sizeof( *X ), X, 0, NULL, NULL );

我理解错误检查的必要性,但他们实际上从未检查过返回值。他们只是将它分配给错误并覆盖它。在我的代码中,我有这个......

status = clfftSetPlanPrecision(bpm->fft_plan, bpm->float_type);
    if(status != CLBPM_SUCCESS)
        goto cleanup;

    status = clfftSetLayout(bpm->fft_plan, CLFFT_COMPLEX_INTERLEAVED, CLFFT_COMPLEX_INTERLEAVED);
    if(status != CLBPM_SUCCESS)
        goto cleanup;

    status = clfftSetPlanScale(bpm->fft_plan, CLFFT_FORWARD, 1.0f / (bpm->grid_size * bpm->grid_size));
    if(status != CLBPM_SUCCESS)
        goto cleanup;

    status = clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f);
    if(status != CLBPM_SUCCESS)
        goto cleanup;

    status = clfftSetResultLocation(bpm->fft_plan, CLFFT_OUTOFPLACE);
    if(status != CLBPM_SUCCESS)
        goto cleanup;

示例代码只是错误的代码,还是通过函数调用传播的错误?

2 个答案:

答案 0 :(得分:5)

对我而言,它看起来像是可以改进的代码。它通常比忽略返回值更好,因为你可以在调试时看到实际的返回值。在您的示例中,不需要特殊的错误处理,为了更好的可读性,宏可以是一个选项:

#define ON_ERROR_GOTO_CLEANUP(status) if(status != CLBPM_SUCCESS) goto cleanup

ON_ERROR_GOTO_CLEANUP(clfftSetPlanScale(bpm->fft_plan, CLFFT_BACKWARD, 1.0f));

答案 1 :(得分:2)

我的猜测是:一个懒惰的程序员(又名"糟糕的代码")。

你是对的,它只会抛出每个错误值,并且不会检查它。

这种情况并不常见,因为它可能起作用,并且大部分时间都是#34;并且很少使用错误路径。