这段代码中的错误检查点是什么?

What is the point of error checking in this code?

我正在查看 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 );

我理解错误检查的必要性,但他们从未真正检查 return 值。他们只是将其分配给 err 并覆盖它。在我的代码中我有这个...

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;

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

我的猜测是:一个懒惰的程序员(又名 "bad code")。

你是对的,它只是丢弃了每个错误值,并没有检查它。

这并不少见,因为它可能有效 "most of the time" 并且很少使用错误路径。

对我来说,它看起来像是可以改进的代码。这比通常忽略 return 值要好,因为您可以在调试时看到实际的 return 值。在您的示例中,不需要特殊的错误处理,为了提高可读性,可以选择宏:

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

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