gpt4 book ai didi

c++ - 我可以包含全局静态成员吗​​?

转载 作者:搜寻专家 更新时间:2023-10-31 00:02:58 24 4
gpt4 key购买 nike

在其中一个头文件中,很少有全局变量是静态的。我看到这些变量在关联的 .cc 文件中使用。所以,看起来这没有问题。

我的问题是:

  • 包含全局变量与静态全局变量有什么区别?我知道静态全局在其文件之外没有可见性。但是不知道当它作为 #included 的 .h 的一部分出现时如何工作。

  • 我写了一个示例程序,并尝试了同样的事情。但是,当我将变量设为静态时,出现编译错误。如果它只是全局性的,那很好。那么,我在常规 g++ 构建中缺少什么吗? (请注意,最初的案例是在我们的官方代码库中,它有足够的 makefile、.h 文件和所有文件)。

感谢您的帮助!

这是我的示例程序:

.h文件:

#include <iostream>

typedef unsigned int uint;

static const int appk=189;

class abc1
{
public:
abc1(int x);
virtual void printVal();

};

.cc 文件:

#include "abc1.h"

extern int appk;

abc1::abc1(int x)
{

}

void abc1::printVal()
{
printf("abc1 print: %d\n", appk);
}

最佳答案

(1) 如果您将一个全局变量放在.h 文件中并将其包含在各种.cpp/.cc 文件中,那么它会为每个文件定义多次。因此,您最有可能遇到链接器错误。为了克服这个问题,大多数情况下您可能会使用 extern 关键字:

// myfile.h
extern int i;

并仅在一个翻译单元中定义:

// somefile.cc
int i;

(2) 如果你把一个 static 全局变量放在一个 .h 文件中并包含它,那么你不会得到任何错误,因为对于每个 不同的翻译单元static 全局变量会有不同的拷贝。

// myfile.h
static int i; // creates a unique and unrelated copy in all .cc file where included

但是,这种用法已弃用;相反,最好使用未命名的 namespace:

namespace {
int i;
}

从你的问题来看,我看不出你应该得到任何 static global 的链接器错误。

关于c++ - 我可以包含全局静态成员吗​​?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7058412/

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