首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多行宏导致"Expected a Declaration“错误

多行宏导致"Expected a Declaration“错误
EN

Stack Overflow用户
提问于 2019-07-26 00:55:18
回答 1查看 628关注 0票数 0

我正在尝试使用CUDA C进行GPU计算,特别是矩阵求逆问题。同时,在我的代码的开头,我定义了函数。但是,这似乎给了我一个错误,在我启动"do“的行处出现了”预期下降“的错误。

我是C++的新手,所以没怎么尝试过。

代码语言:javascript
复制
#include<cublas_v2.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

#define cudacall(call)
    do
    {
        cudaError_t err = (call);
        if (cudaSuccess != err)
        {
            fprintf(stderr, "CUDA Error:\nFile = %s\nLine = %d\nReason = %s\n", __FILE__, __LINE__, cudaGetErrorString(err));
            cudaDeviceReset();
            exit(EXIT_FAILURE)
        }
    }
    while (0);

“预期的声明”

EN

回答 1

Stack Overflow用户

发布于 2019-07-26 01:48:56

多行宏需要有一个\来指示它们继续到下一行。我把它们都排在最后;滚动查看。

代码语言:javascript
复制
#define cudacall(call)                                                         \
  do {                                                                         \
    cudaError_t err = (call);                                                  \
    if (cudaSuccess != err) {                                                  \
      fprintf(stderr, "CUDA Error:\nFile = %s\nLine = %d\nReason = %s\n",      \
              __FILE__, __LINE__, cudaGetErrorString(err));                    \
      cudaDeviceReset();                                                       \
      exit(EXIT_FAILURE)                                                       \
    }                                                                          \
  } while (0);

一般来说,请尽量避免使用宏。改用lambdas和高阶函数:

代码语言:javascript
复制
template<class F> 
void cudacall(F&& func) {                                                                    
    cudaError_t err = func();                                                  
    if (cudaSuccess != err) {                                                  
        fprintf(stderr, "CUDA Error:\nFile = %s\nLine = %d\nReason = %s\n",      
              __FILE__, __LINE__, cudaGetErrorString(err));                    
        cudaDeviceReset();                                                       
        exit(EXIT_FAILURE);                                                     
    }                                                                          
}

我们可以这样使用它:

代码语言:javascript
复制
void dostuff() {
    bool wasICalled = false;
    cudacall([&]() {
        // Code goes here

        // We can access and modify local variables inside a lambda
        wasICalled = true; 

        // Return the error
        return cudaError_t{}; 
    }); 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57206878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档