如何在类之外声明一个函数?

时间:2013-05-29 19:17:52

标签: c++ cuda

以下是该方案:

我有一些类函数必须由一些C ++派生的编译器(CUDA nvcc)编译。但是,我需要通过常规C ++编译器编译类声明。我知道必须在类声明中声明一个类函数。不知道如何绕过这个问题。谢谢!

说我有一个文件“a.cpp”:

class A
{
  private:
    int i;
  public:
    __global__ int f() {return i;}
}

这里__global__意味着需要由其特定编译器编译的CUDA内核代码。但是,我需要通过常规C ++编译器编译“a.cpp”。

我考虑过使用一个与CUDA编译器构建的内核库链接的包装器。但是,内核需要引用类私有变量(“int i”),我试图避免传递它们。

2 个答案:

答案 0 :(得分:3)

将类成员函数实现为extern函数的包装器。然后,您可以根据需要实现和编译外部函数。

在代码中:

extern "C"{
... quux(...);
}

class Foo{
public:
 ... bar(...){ return quux(...); }
}

答案 1 :(得分:2)

我建议使用宏观防御:

#ifdef __CUDACC__
#define GLOBAL_CUDA __global__
#else
#define GLOBAL_CUDA
#endif

因此,当CUDA编译器获取文件时,它将看到__global__如果它是普通的C ++编译器,它只会看到一个空格

class A
{
  private:
    int i;
  public:
    GLOBAL_CUDA int f() {return i;}
}