繁体   English   中英

C++ 中全局变量的替代品

[英]Alternatives To Global Variables in C++

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

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
}

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);
}

我无法将其传递给函数

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

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

namespace {
    int myglobalvar;

    void myFunc() {
        // ...

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

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

不可移植,但这适用于 GCC 和 x86 上的 clang:

神箭

#include <cstdio>
#include <cstdlib>

void foo() {
  int i;
  asm volatile("movl %%edi, %0" : "=g"(i));
  std::printf("I am passed %d\n", i);
}

int main() {
  char const* str = "42";
  int  const i = std::atoi(str);
  asm(R"(
    subq $8, %%rsp
    movl %0, %%edi
    call %P1
    addq $8, %%rsp
  )" ::"g"(i), "i"(foo));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM