gpt4 book ai didi

c++ - 接头防护装置和 LNK4006

转载 作者:可可西里 更新时间:2023-11-01 15:39:56 26 4
gpt4 key购买 nike

我在标题中定义了一个字符数组

//header.h
const char* temp[] = {"JeffSter"};

标题如果#defined protected 并且在顶部有一个#pragma once。如果这个 header 包含在多个地方,我会得到一个 LNK4006 - char const * * temp 已经在 blahblah.obj 中定义。所以,我对此有几个问题

  1. 如果我有守卫,为什么会发生这种情况?我认为他们阻止了在第一次访问后读入标题。
  2. 为什么此 header 中的大量枚举没有同时给出 LNK4006 警告?
  3. 如果我在签名前添加静态,我就不会收到警告。这样做的含义是什么。
  4. 有没有更好的方法来避免错误,但让我在标题中声明数组。我真的不希望有一个 cpp 文件只用于数组定义。

最佳答案

Why does this happen if I have the guards in place? I thought that they prevented the header from being read in after the first access.

Include guards 确保标题在一个文件(翻译单元)中只包含一次。对于包含标题的多个文件,您希望标题包含在每个文件中。

通过定义,与在头文件中声明具有外部链接(全局变量)的变量相反,您只能在一次源文件中包含头文件。如果在多个源文件中包含头文件,就会出现一个变量的多个定义,这在C++中是不允许的。

因此,正如您所发现的,正是出于上述原因,在头文件中定义变量是个坏主意。

Why do the numerous enums in this header not also give the LNK4006 warnings?

因为,它们没有定义“全局变量”,它们只是关于类型等的声明。它们不保留任何存储空间。

If I add static before the signature, I don't get the warning. What are the implications of doing it this way.

当您将变量设置为static 时,它具有static 作用域。该对象在定义它的翻译单元(文件)之外是不可见的。因此,简单来说,如果您有:

static int i;

在您的 header 中,包含 header 的每个源文件都将获得一个单独的 int 变量i,它在外部是不可见的源文件。这称为内部链接

Is there a better way to do this that avoids the error, but lets me declare the array in the header. I would really hate to have a cpp file just for an array definition.

如果您希望该数组成为所有 C++ 文件中可见的一个对象,您应该这样做:

extern int array[SIZE];

在您的头文件中,然后将头文件包含在所有需要变量array 的C++ 源文件中。在一个源文件(.cpp)中,您需要定义array:

int array[SIZE];

您还应该在上述源文件中包含 header ,以允许捕获由于 header 和源文件中的差异而导致的错误。

基本上,extern 告诉编译器“array 已在某处定义,类型为 int,大小为 SIZE”。然后,您实际上只定义 array 一次。在链接阶段,一切都很好地解决。

关于c++ - 接头防护装置和 LNK4006,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105716/

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