我正在查看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;
示例代码只是错误的代码,还是通过函数调用传播的错误?
答案 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;并且很少使用错误路径。