如何为cpp和h文件创建别名(并忽略编译器__attributes __)

时间:2018-01-11 21:45:29

标签: c++ gcc cuda header c-preprocessor

如何为cpp和h文件创建别名,以便GCC可以编译不同命名后缀的文件?

如何让GCC忽略某些编译器属性而不必将它们包含在#ifdef#endif语句中?

精化:

我正在用CUDA编写一个库,我希望能够在CPU和GPU上创建相同的对象。

如果用户没有NVCC(这是一个只有标题的库),我希望用户能够使用GCC进行编译。

无论如何我可以在忽略.cu .cuh__host__编译器属性的同时使GCC编译__device____global__文件,而不必简​​单地包装所有

的: __host__语句中的__device__ __global__#ifdef #endif

IE:#ifdef NVCC //将nvcc解释为.cu文件

__host__ __device__ 
struct foo {
    foo() {/*impl*/ }
};

ELSE://将GCC / Clang / etc解释为.cu文件(以及.h文件):

struct foo {
    foo() {/*impl*/ }
};

2 个答案:

答案 0 :(得分:2)

您可以在随处包含的头文件中执行以下操作:

#ifdef __CUDACC__ 
#define CUDAHOSTDEV __host__ __device__
#else
#define CUDAHOSTDEV
#endif

然后,无论你在哪里使用

__host__ __device__

你只需使用

CUDAHOSTDEV

我不知道这是否更容易,但如果您从头开始写东西,可能就更少打字了。

您可以看到一些特定于CUDA的nvcc编译器定义here

此外,我非常确定您可以将-x开关传递给gcc / g ++,告诉它识别/使用哪种语言,而不依赖于文件后缀。

您可能还想看一下现有的高品质"像thrust这样的CUDA模板库可以看到它们的作用。

答案 1 :(得分:-1)

你需要#ifdef / /#endif,但是如果没有设置标志,你可以通过#defining扩展为空值的符号来使这些事情看起来更好:

#if defined(CCOMPILE_WITH_GPU)
#define MY_ATTRIBUTE xxx
#endif

MY_ATTRIBUTE void func();

而不是将#ifdef放在每个函数声明周围。