gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:16 24 4
gpt4 key购买 nike

我一直在使用 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

然后我将这个文件包含在我的大部分源文件中:

//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 */

VS 2010 编译器输出如下错误:“error LNK2005: foo already defined in other_source_file_I_wrote.cu.obj”

为什么要这样做?此外,为了一石二鸟,使用此设置,我在 source_file.cu 中编写一个函数,然后在 vars.cuh 中对其进行原型(prototype)设计时也遇到了问题。问题出现了,vars.cuh 看不到定义,即使我在 source_file.cu 中明确包含了 vars.cuh!

谢谢!

最佳答案

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

如果您想在多个源文件中共享全局变量,请在 header 中将它们声明为 extern,然后在一个源文件中分别定义一次。

这不是 Visual Studio 或 Visual C++ 编译器的问题,而是 C 的工作方式。

关于c - 为什么 Visual Studio 2010 两次包含头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com