为什么Visual Studio 2010包含头文件两次?

Eri*_*oma 1 c include header-files visual-c++ visual-c++-2010

我一直有这些与Visual Studio 2010中非常奇怪的问题,在这一点上,行为是如此的不稳定,我真希望我没有使用它的CUDA(我知道我并不需要,但它很难不使用它).

我遇到的许多基本问题之一是头文件不止一次被包含在内.例如:

//vars.cuh
#if !defined(VARS_cuh)
#define VARS_cuh

#include <cuda.h>
#include <cuda_runtime_api.h>

int* kern_xstart, *kern_xend, *kern_ystart, *kern_yend, *kern_zstart, *kern_zend;
/* more variable definitions */

#endif
Run Code Online (Sandbox Code Playgroud)

然后我在大多数源文件中包含此文件:

//source_file.cu
extern "C"{
#include "vars.cuh"
/* more includes of my own headers */
#include <cuda.h>
#include <cuda_runtime_api.h>
}

/* source file body */
Run Code Online (Sandbox Code Playgroud)

VS 2010编译器发出如下错误:"错误LNK2005:foo已在other_source_file_I_wrote.cu.obj中定义"

它为什么这样做?另外,为了用一块石头杀死两只鸟,使用这种设置,我也有在source_file.cu中编写函数,然后在vars.cuh中进行原型设计的问题.问题是vars.cuh无法看到定义,即使我在source_file.cu中明确包含vars.cuh!

谢谢!

Jam*_*lis 9

头文件正在被多次编译,因为正如您所说,您在大多数源文件中包含此头文件.这些全局变量包含在多个源文件中,因此在包含标头的每个源文件中定义.当链接器将所有目标文件链接在一起时,它会找到这些变量的多个定义,因此会出错.

如果要跨多个源文件共享全局变量,请extern在标头中声明它们,然后在一个源文件中定义它们中的每一个.

这不是Visual Studio或Visual C++编译器的问题,而是C的工作原理.