c++如何在两个.cpp文件中使用同一个全局变量

在c/c++中,当创建一个类,将声明和定义分开写的时候,

即产生   1.h,  1.cpp,   main.cpp   文件的时候,

如果想使用一个全局变量m,使m能够在两个.cpp文件中都能使用,则方法如下:

1,在1.h头文件中   extern char m[];

2,在1.cpp文件中 #include"1.h"  char m[6];

3,在main文件中,#include“1.h”

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果在a.cpp和b.cpp都有一个名为aa的函数,且这两个函数实现的内容相同,那么在链接时,编译器将会将这两个函数合并为一个函数。因此,无论是在a.cpp还是在b.cpp调用函数aa来初始化local static对象,都将使用同一个函数实现,从而生成同一个local static对象。 举例来说,如果在a.cpp和b.cpp都有以下代码: ```cpp #include <iostream> void aa() { static int obj = 0; std::cout << &obj << std::endl; } int main() { aa(); return 0; } ``` 那么在链接a.cpp和b.cpp后,程序输出的地址将会相同,表明这两个local static对象是同一个对象。 ### 回答2: local static对象是指在函数内部声明的static变量。它的生命周期从程序第一次运行到程序结束。当函数被调用时,该变量会被初始化,并在函数执行结束后保持其值,直到下次调用函数时再次初始化。 在这个问题,当a.cpp和b.cpp两个文件被链接在一起时,它们共享同一个进程空间,也就是说它们共享同一个内存地址空间。 假设在a.cpp有如下代码: ```cpp #include <iostream> void aa() { static int num = 0; num++; std::cout << "a.cpp: " << &num << std::endl; } ``` 在b.cpp有如下代码: ```cpp #include <iostream> void aa() { static int num = 0; num++; std::cout << "b.cpp: " << &num << std::endl; } ``` 当我们在主函数依次调用两个函数,即: ```cpp int main() { aa(); aa(); return 0; } ``` 运行上述代码后,控制台输出的结果可能是: ``` a.cpp: 0x12345678 a.cpp: 0x12345678 ``` 可以看到,两次调用函数aa的地址是相同的。 这是因为local static对象存储在全局数据区,它们的内存地址是固定的。当链接器将a.cpp和b.cpp链接在一起时,它们共享了同一个内存地址空间,因此两个静态变量的地址是相同的。 需要注意的是,如果a.cpp和b.cpp分别编译为独立的执行文件,那么它们的静态变量地址将独立存在,不会相同。只有在被链接在一起后,才会共享相同的地址空间。 ### 回答3: 在C++,每个源文件都是独立编译的单元。当我们将两个文件a.cpp和b.cpp链接在一起时,它们将成为同一个可执行程序的一部分。 在a.cpp调用函数aa初始化local static对象,意味着这个对象是在aa函数首次调用时创建的,并且它的生命周期将延续到程序结束。当b.cpp被链接到程序时,b.cpp也调用了函数aa来初始化另一个local static对象。 由于这两个local static对象分别位于不同的源文件,并且每个源文件都是独立编译的,它们是两个不同的对象。因此,它们的地址是不同的。 假设a.cpp的local static对象的地址是0x1000,b.cpp的local static对象的地址是0x2000。当两个文件链接在一起并形成可执行程序时,它们的地址不会改变。因此,在可执行程序,这两个对象的地址仍然是0x1000和0x2000。 简而言之,不论在哪个源文件初始化local static对象,它们的地址是不同的,即使将它们链接在一起后也是如此。 请注意,上述情况是指每个源文件都有一个独立的local static对象。如果我们将同一个local static对象在多个源文件定义和初始化,链接时编译器会将这些定义合并为一个对象,并且这个对象的地址在整个程序都是相同的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值