C++ 如何为cpp和h文件创建别名(并忽略编译器属性)

C++ 如何为cpp和h文件创建别名(并忽略编译器属性),c++,gcc,cuda,header,c-preprocessor,C++,Gcc,Cuda,Header,C Preprocessor,如何为cpp和h文件创建别名,以便GCC可以编译具有不同命名后缀的文件 如何使GCC忽略某些编译器属性,而不必将它们包装在#ifdef和#endif语句中 阐述: 我正在用CUDA编写一个库,我希望能够在CPU和GPU上创建相同的对象 如果用户没有NVCC(这是一个只有标题的库),我希望用户能够使用GCC进行编译 无论如何,我是否可以让GCC编译.cu和.cuh文件,而忽略\uuuuuuu主机\uuuuuuuu\uuuu设备\uuuuu和\uuuu全局\uuuuuuuuuu编译器属性,而不必简

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

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


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

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

无论如何,我是否可以让GCC编译
.cu
.cuh
文件,而忽略
\uuuuuuu主机\uuuuuuuu
\uuuu设备\uuuuu
\uuuu全局\uuuuuuuuuu
编译器属性,而不必简单地包装所有属性

其中:
\uuuuuuuuuuu主机
\uuuuuuu设备
\uuuuuuu全局uuuuuuuu
语句中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


IE:#ifdef NVCC//让NVCC解释
.cu
文件本身

__host__ __device__ 
struct foo {
    foo() {/*impl*/ }
};
ELSE://让GCC/Clang/etc解释
.cu
文件(以及
.h
文件):

您需要在某个地方使用#ifdef/#endif,但通常可以通过#定义扩展为空值的符号(如果未设置标志),使这类事情看起来更好:

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

MY_ATTRIBUTE void func();

不要在每个函数声明中都使用#ifdef。

您可以在包含所有内容的头文件中执行类似操作:

#ifdef __CUDACC__ 
#define CUDAHOSTDEV __host__ __device__
#else
#define CUDAHOSTDEV
#endif
然后,无论你在哪里使用

__host__ __device__
你只要使用

CUDAHOSTDEV
我不知道这是否更容易,但如果你从头开始写东西的话,打字可能会少一些

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

另外,我非常确定您可以将
-x
开关传递到gcc/g++来告诉它独立于文件后缀识别/使用哪种语言


您可能还希望查看现有的“高质量”CUDA模板库,以了解它们的功能。

-x language明确指定以下输入文件的语言(而不是让编译器根据文件名后缀选择默认语言)。此选项适用于以下所有输入文件,直到下一个'-x'选项。语言的可能值是:C C标题CPP输出C++ C++ +CPP输出Objul-C Objc CPP输出汇编程序汇编程序,带有CPP艾达F77 F77 CPP输入RATA java TreLange<代码>找到了文件<>代码> -x/Cuth>:这里我将把这个问题开长一点,但我最有可能给你最好的答案。一个完美的解决方案。(我知道你不应该说“谢谢”,但我是个叛逆者)
CUDAHOSTDEV