【问题标题】:Alternatives To Global Variables in C++C++ 中全局变量的替代方案
【发布时间】:2021-09-10 05:38:17
【问题描述】:

我需要在主函数中设置一个变量,并从同一个文件中的不同函数访问它。我不能将它传递给函数,因为这意味着更改整个代码结构,这不是一个选项。为了避免声明全局变量,我创建了一个命名空间,我想检查这是否是一种好的编程习惯,或者是否有更简洁的方法来做到这一点。 这是代码:

namespace mylocalnamespace{
    int myglobalvar;
}

static void myFunc()
{
    ..... some code
    operationX(mylocalnamespace::myglobalvar);
    ..... some code

}
int main(int argc, char **argv)
{
   ..... some code
   mylocalnamespace::myglobalvar = atoi(argv[0]);
   ..... some code
}

【问题讨论】:

  • 如果您不想传递参数,那么唯一的选择是将其放入两个函数都可以访问的范围内。所以命名空间范围。单例也可以是一种安全的方法。
  • 将全局命名空间中的全局变量放入mylocalnamespace 命名空间中仍然是一个全局变量。但现在它是命名空间中的全局变量。
  • 如果您的代码结构错误,您将花费大量时间来解决错误。最好现在修复它。
  • 看起来 Lily 正在与遗留代码作斗争。问题是太多的信息已经从问题中剥离出来。 @Lily 请提供更多详细信息!您需要维护什么样的兼容性:二进制/源代码?是否涉及线程?谁访问这个全局状态:它是从调用到调用还是其他函数访问该状态?您是否在没有参数的情况下实际运行?如果不提供有关参数的信息。确保每个人都清楚什么是固定的什么被剥离了什么是明确的。

标签: c++ scope namespaces logic global-variables


【解决方案1】:

C++ 中全局变量的替代方案

在示例中,函数参数是避免全局变量的好方法:

static void myFunc(int mylocalvar)
{
    ..... some code
    operationX(mylocalvar);
    ..... some code

}
int main(int argc, char **argv)
{
   ..... some code
   mylocalvar = atoi(argv[0]);
   ..... some code
   myFunc(mylocalvar);
}

我不能把它传递给函数

哦,那你必须使用全局变量。

由于您显然在具有内部链接的函数中使用它,因此您也可以通过使用带内部链接的全局来稍微改进。这样全局不会泄漏到其他翻译单元。一个方便的方法是匿名命名空间:

namespace {
    int myglobalvar;

    void myFunc() {
        // ...

为了避免声明全局变量,我创建了一个命名空间

即使不在全局命名空间中,全局变量仍然是全局变量。

【讨论】:

  • OP 说他们不想使用函数参数。
  • 我不能将它作为函数参数传递,因为它包括更改代码的结构,这不是一个选项。我被特别要求不要改变这一点。
  • @Lily 那么你必须使用一个全局的。您可以通过使用内部链接对其进行一些改进。
  • @eerorika 内部链接是解决方案,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2019-06-13
  • 1970-01-01
  • 2023-03-30
  • 2015-07-05
相关资源
最近更新 更多